eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

programming python-basic-lectures

【基本を学ぶ7:超初学者向け】Pythonプログラミング入門【ファイル処理編】

Pythonプログラミング入門【ファイル処理編】




(初めからしっかり学びたい方はこちら↓↓)



このシリーズを最後まで学習することで
Pythonプログラマとして太い知識の主軸を積み上げる事ができます。


これまでPythonの対話環境にて学習を進めてきました。
計算結果等はprint()関数を利用し、
ターミナルに表示される出力にて確認してきたと思います。


そろそろ次のステージに行く時です。
もう少しレベルアップした出力方法として
ファイルにデータを書き出す事が挙げられます。


コンソールでの標準出力は保存されず、Pythonの対話環境を終了すると
同時に消えてしまいますが、ファイルに書き込み、残す事で
計算結果や様々なデータを保存する事ができます。


Pythonでは他の言語と同様にファイルへの入出力を行う
組み込み関数が用意されており、エンジニアとしては必須の知識となります。



ファイル操作を習得できるようになると、一気にプログラミングらしく
感じる事ができのでぜひ積極的に学んでいきましょう。


悩むペン銀

pythonを使いファイル処理を行う方法を学びたい

実践的にファイル処理を行う場合、どういった問題があるのか実際に手を動かして学びたい


本記事ではこのような疑問に答えていきます。




本記事の内容

  • Pythonにおけるファイル処理操作について
  • ファイル処理を行う実践問題







  • ファイルとは



    ファイルは様々なデータを保持するものであり、
    Operation Systemが管理するファイルシステム上に存在します。


    特にファイルは大きく分けてバイナリファイル及びテキストファイルがあり

  • バイナリファイル
  • テキストファイル

  • の2つが存在します。

    それぞれ簡潔に説明するとバイナリファイルでは
    「computerが解釈しやすい形式で記述されたファイル」であり
    基本的に人間が読んでも理解できません。


    一方テキストファイルは「文字列が記述されたファイル」であり
    このファイルに書かれたデータは人間でも理解できます。


    今回取り扱うものはテキストファイルです。
    特に拡張子が.txtになっているファイルを取り扱います。


    (*拡張子とはファイルの保存形式のことです。
    macを利用している方であればTextEditというアプリケーションが標準で用意されています。
    そのappで文字を打ち込み保存してみてください。
    ファイルが『ファイル名.txt』の形式で保存されるはずです。
    本記事はそのファイル編集をターミナルを使って実現するという内容です。


    また今回は扱いませんが
    マイクロソフト社のExel で編集し保存したファイルは
    『ファイル名.csv』の形式で保存されます。)



    データをファイルへ書き込む



    Pythonでは組み込み関数としてファイル入出力のモジュールが用意されているため
    簡単にデータを保存する事ができます。


    その1つとして組み込み関数openが用意されており
    以下のようにしてファイルに書き込みます。

    >>>
    >>> file = open("new_file.txt", "w") 
    >>> file.write("Hello World!")
    >>> file.close()
    >>>



    open()関数の第一引数には「新規作成するファイル名」を
    第二引数にはその作成するファイルに対してどのような処理をするのか
    を決定する「モード」を選択します。



    ここでは“w”を指定する事で書き込み可能なファイルオブジェクトとしてfile
    取得しており
    3行目で”Hello World!”の文字列をファイルに書き込みしています。
    最後にファイルオブジェクトをcloseする事で一連の動作を終了します。



    また、with構文を利用する事でファイル書き込み後にオブジェクトを自動的にclose()
    割り当てられたメモリを解放してくれる為手間がかからない様に実装することも可能です。



    この形式でファイルに書き込みを行う場合
    ファイルオブジェクトfはキーワードasを用いて定義します。



    またasの後のオブジェクトfは他の文字でも構いません(例えばfile, dataでも可能です)
    with構文を使わない場合に比べf.closeする必要がない為頻繁に利用する機会があるでしょう。


    >>> word = "Hello World!"
    >>> with open("new_file.txt", "w") as f
    ...     f.write(word)
    ...
    >>>



    これによりカレントディレクトリに『new_file.txt』というファイルが
    生成されているはずです。catコマンドを使って中身を確認してみましょう。


    以下のような標準出力が得られれば、正しくファイルに文字列を
    書き込む事ができています。


    [ユーザー名$] cat new_file.txt
    Hello World!



    データを追記で書き込む



    書き込みモードを“w”で選択する場合、new_file.txtに何かしらデータが書き込まれた状態であっても、常に新しく上書きされてしまいます。


    そこで元あるデータに追記したい場合ではモードの選択を”a”に設定します。
    これによりファイルに元あるデータを消されることなく、追記の形でデータを保存する事が可能となります。

    >>> with open("new_file.txt","a") as f:
    ...     f.write("My name is seimei")
    ...
    >>>
    


    pythonの対話環境を抜け、catコマンドを利用して確認してみましょう。
    new_file.txtの内容は以下の様になっているはずです。

    [ユーザー名$] cat new_file.txt
    Hello World!
    My name is seimei



    ファイルのデータを読み込む


    さてファイル読み込みについて話しましょう。
    ファイルからテキストを読み込む場合もほぼ同様のコードとなります。


    new_file.txtファイルを作成しましたが
    このファイルの文字列を取得してみます。
    以下のコードを入力してみましょう。

    >>> with open("new_file.txt","r") as f:
    ...     str = f.read()
    ...
    >>> 
    >>> str
    Hello World!



    テキストファイルに記述されたデータ
    文字列”Hello World!”が取得できていることを確認できたでしょうか?


    書き込みの場合と異なるのはモードが”r”になっている事と
    コード二列目にある様に.read()関数を使って文字列を読み込んでいる事です。


    ファイル処理を実践してみる



    練習用ファイルを用意しました。
    実際にファイルを読み込んで編集し、保存してみましょう。



    今回は非暴力抵抗運動を訴えたキング牧師のスピーチ内容を
    文字列として保存したファイルを用意しました。




    ダウンロードしたファイルは/Users/ユーザー名/Downloads/にking.txtとして
    ダウンロードされているはずなので、ホームディレクトリに移動させてください。
    (ターミナルにてpwdコマンドを入力し、
    以下の表示が出れば現在あなたがホームディレクトリにいる事を確認できます)

    [ユーザー名$] pwd
    /Users/ユーザー名/


    GUIで移動させるなら
    Finderを開きDownloadsよりホームディレクトリ(Devices➡︎Machintosh HD➡︎Users➡︎ユーザー名)にdrag and dropで移動できます。


    catコマンド
    を利用して内容を確認して見ましょう。
    以下の様な出力が得られます。

    [ユーザー名$] cat king.txt
    I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation.
    
    Five score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation. This momentous decree came as a great beacon light of hope to millions of Negro slaves who had been seared in the flames of withering injustice. It came as a joyous daybreak to end the long night of their captivity.
    
    But one hundred years later, the Negro still is not free. One hundred years later, the life of the Negro is still sadly crippled by the manacles of segregation and the chains of discrimination. One hundred years later, the Negro lives on a lonely island of poverty in the midst of a vast ocean of material prosperity. One hundred years later, the Negro is still languished in the corners of American society and finds himself an exile in his own land. And so we’ve come here today to dramatize a shameful condition.
    
    In a sense we’ve come to our nation’s capital to cash a check. When the architects of our republic wrote the magnificent words of the Constitution and the Declaration of Independence, they were signing a promissory note to which every American was to fall heir. This note was a promise that all men, yes, black men as well as white men, would be guaranteed the “unalienable Rights” of “Life, Liberty and the pursuit of Happiness.” It is obvious today that America has defaulted on this promissory note, insofar as her citizens of color are concerned. Instead of honoring this sacred obligation, America has given the Negro people a bad check, a check which has come back marked “insufficient funds.”
    .....


    問題


    それでは以下の処理を実現するコードを書いてみましょう。

    ① 文頭の I am happy から ..our nation. までの段落を抜き出す

    ② 抜き出した文章を新しいファイルnew_king.txtに書き出し保存する




    もちろん正解の回答は1つではなく、複数考えられますが、
    正解のコード例として答えを1つ用意しています。



    まずは回答を見ないで自分でやって見ましょう
    自分の頭を使う事が大切ですよ。


    ヒント


    データ型関数split()を利用すると比較的簡単に実現できるでしょう。




    正解例



    解答例の一つとして以下の様にコードを書く事ができるでしょう。
    まずはファイルking.txtに保存された文字列を変数に代入します。

    >>> with open("king.txt","r") as f:
    ...    text = f.read()
    ...
    >>> text = text.split("\n")
    >>> sentence = text[0]
    >>> sentence
    'I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation.'


    2行目のtextを確認すると
    Pythonでは改行を\nで表している事がわかります。

    そこでデータ型関数である.split()関数を利用する事で
    段落毎に文章をリストとして格納する事が実現できます。


    後はリストの先頭を指定する事で、文章の1段落目を抜き出す事ができるでしょう。


    指定した文字列をテキストから抜き出す事ができたら
    続いて文字列をファイルに保存します。


    今回勉強した知識を生かし以下の様にコードが書けるでしょう。

    >>> with open("new_file.txt","w") as f:
    ...     f.write(sentence)     
    ...
    >>>



    catコマンドでnew_file.txtのファイルの中身を確認すると
    以下の様な出力が得られるはずです。

    [ユーザー名$] cat new_file.txt 
    'I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation.'


    この出力が得られたならば、今回
    コードの書き方はどの様に書いても構いません。


    クリアです!


    まとめ



    いかがだったでしょうか?


    今回はPythonによるファイルの入出力について学びました。
    エンジニアになればファイル操作は必須の知識として要求され、日常的に使用します。
    ぜひ身につけていつでも実行できる様にしておきましょう。
    何事もコツコツと積み上げる事が大切です。



    今回は以上です。
    ではでは





    続編の記事はこちら↓↓






    人気記事【初学者必見】効率的なプログラミング勉強方法を紹介します

    人気記事 CS学位取得者がガチでプログラミングスクールを調査してみた件【おすすめのスクール】







    このエントリーをはてなブックマークに追加
    data-ad-format="rectangle" data-ad-format="rectangle"

    返信する

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    某国立大学大学院(理系)に所属しています。 最近の趣味は人工知能関連の論文を読む事で 研究ではComputer Vision周りを中心に活動しており、 サイドワークとしてデータ分析の業務に関わっています。 本ブログはこれまで筆者が学んできた様々な知識の中から 有益だと思えた情報のみをまとめたものです。 内容は個人の見解であり、所属する機関と関係するものではありません。 Research: is related to Computer Vision Hobby: is to study Artificial Intelligence / Machine Learning.