理系母の趣味はプログラミング

理系院卒、メーカー技術職の二児の母が、PythonやVBAで色々と作ってアップしていくブログです。

【15日目】ファイル操作②open関数でファイルを読み書きする

こんばんは、なぺです。
今日はファイル操作の二回目です。
今日はファイルの読み書きをPythonでやってみます。

ファイルの読み書きにはopen関数を使います。

open("ファイルパス", "モード")

モードにはファイルを開くときにどのように動作するべきかを決定する文字を入れます。

  • ”r"  読み込み専用
  • "w"  書き出し専用
  • "w+" 読み書き両方可

open関数は、ファイルオブジェクトと言われるオブジェクトを返します。

・ファイルに書き込む
モード="w"のとき、新しいファイルを作ります。

ファイルオブジェクトに書き込むにはwriteメソッドです。

では早速、ファイルを新規作成して書き込んでみます!
ファイルパスの部分はセキュリティ上載せておりませんよ!

file = open('ファイルパス\\hoge.txt','w')
file.write("i can do it!")

指定したディレクトリを実際に見に行って確認する。
お、あったあった、hoge.txtが新しくできておる!
どれどれ、中身は…
あれれ~白紙だよ?
"i can do it!"と書き込んだはずなのに…。

はい、実は本のコードを省略していました。すみません。
ファイルに書き終わったらcloseメソッドを使ってファイルを閉じる必要があるみたいです。
複数のファイルを開いた後に閉じるのを忘れてしまうと、プログラムがうまく動作しないことがあるらしいです。
「まあ、複数のファイル開いてないし、大丈夫でしょ!」
と考えてcloseメソッドを省略しましたが、ダメでしたね。

ということでまじめにcloseメソッドを追加。

file = open('ファイルパス\\hoge.txt','w')
file.write("i can do it!")
file.close()

できました!i can do it!とメモ帳に入力されてました。

ちなみに日本語などの「非アスキー文字」を書き込む場合、open関数の引数として、ファイルの文字コードを指定したほうがいいらしいのですが…

試しに日本語を入力してみたところ文字コード指定なしで普通に入力できてしまったので、必要不可欠ってわけではなさそう…

file = open('ファイルパス\\nihongo.txt','w')
file.write("日本語ですYO")
file.close()
file = open('ファイルパス\\nihongo.txt','w',encoding="utf-8")
file.write("日本語ですYO")
file.close()

上記どちらもちゃんと書き込めてました。
まあでも、非アスキー文字を扱うときは念のため指定したほうがよさそうですね~。

ところで非アスキー文字ってなんぞ

調べました。

ASCII文字とは、文字コードの標準規格として広く普及している「ASCII」(American Standard Code for Information Interchange、アスキー)に含まれる文字のこと。
いわゆる半角の英字(a~z、A~Z)やアラビア数字(0~9)、記号、空白文字、制御文字など128文字が規定されている。アクセント記号などの付いた文字や、ギリシャ文字キリル文字などラテン文字以外のアルファベット、漢字、仮名、ハングル、タイ文字など非欧米圏の文字、いわゆる全角英数字、全角記号、ローマ数字、顔文字などはASCII文字には含まれない。

引用元↓
e-words.jp


ふむふむ。
プログラミングに使われる文字はアスキー文字。
それ以外は非アスキー文字なのかな?

うん、了解です。

・ファイルを自動的に閉じる
ファイルに書き込む際は、開いた後に閉じることを忘れないことが大事であることがわかりました。
そこで便利な方法としてファイルの閉じ忘れ防止の構文があるらしいです。
えー!じゃあこっちだけ覚えればいいじゃーん!そゆこと早く言って~
とか思ってしまってごめんなさい。

早速使ってみます。

with open("hogehoge.txt","w") as f:
    f.write("hogehoge~hogehoge~!")

できました。構文は下記

with open([ファイルパス], [モード]) as [変数名]:
[コード]

変数名 にはファイルオブジェクトを割り当てる変数名を書きます。
コード にはファイルオブジェクトにどうするか書きます。

withのブロック中のコードをすべて実行し終えると、Python先輩がファイルをそっと閉じてくれます。うれしい!

・ファイルを読み込む
やることは二つ。
1.open関数の引数[モード]の部分に、読み込みを指定する文字"r"を指定する
2.readメソッドを呼び出す。
です。

with open("hogehoge.txt","r") as f:
    print(f.read())

#出力結果
hogehoge~hogehoge~!

日本語も出力してみよう

with open("nihongo.txt","r") as f:
    print(f.read())

#出力結果
譌・譛ャ隱槭□YO

ぎやゃぁぁぁぁ
化けたあああ

文字化け嫌い。

「まあでも、非アスキー文字を扱うときは念のため指定したほうがよさそうですね~。」
とか言って軽く見てましたすみません。

ちゃんと文字コードは指定しましょう。

with open("nihongo.txt","r", encoding="utf-8") as f:
    print(f.read())

#出力結果
日本語だYO

ほっ
できました。

今回はうまくいきましたが、WindowsではシフトJISでファイルが書かれている場合が多いらしく、その場合、encoding="cp932"と指定したほうがいいみたいです。
ただ、私もWindowsですがcp932と指定すると化けました。
よくわからないです。知ってる人教えてください。

今日は以上です!
明日はCSVファイルを扱いますよー!

それではまた^^