Pythonのopen()関数でファイルの開き方を指定する使い方を詳しく説明します
2321 ワード
ファイルの開き方
Open()関数でファイルを開くと、いくつかの開くモードがあります.
'r'->読み取り専用'w'->書き込みのみ、ファイルが存在する場合はクリア、存在しない場合は作成します.a'->追加、ファイル末尾'b'->バイナリモード、例えば画像、オーディオ、wordファイルを開く.'+'->更新(読み取り/書き込み可能)
この'+'号付きはちょっと理解しにくいので、上コードで感じてください.
上のコードは、書くだけでなく、読むこともできます.注意先頭、f.seek(0)にナビゲートします.そうしないと、空のデータが読み出されます.一部の人は迷っているかもしれませんが、'+'号が読める以上、'w+'は'r+'と何が違いますか.つまり、'w+'は空になり、作成されます(ファイルが存在する場合は空になり、存在しない場合は作成されます).r+'は空ではなく、作成しない
バイナリモードでテキストファイルを開かないで、次のコードの「怪しい」現象を見てください.Windowsの下にf.txtファイルがあるとします.中の内容は次のようです.
コード1、
しゅつりょく
コード2、
ファイルを開くと、次のようになり、
まず、改行文字「戻り文字」と「r」の概念を理解します.改行(LF,Line-Feed)は、新しい行を指します.'r',リターン記号(CR,Carriage-Return)は,行頭に戻ることを指す.
システムによって改行IDが異なるためです.
これがwindowsの下のtxtがlinuxが開いたときに行末に'^M'がある理由です.これは私がlinuxの下でスクリプトを走ってゲームのデータをエクスポートしてローカルwindowsに開いて1行になった理由です.
実はテキストファイルもバイナリファイルで、テキスト符号化のバイナリファイルで、テキストファイルはいくつかの非可視文字を処理して、可読性を増加しました.
pythonではos.linesepは、現在のシステムの改行IDを取得します.例えばwindowsの下でos.linesepは'r'です.pythonで改行IDを操作するときは、どのプラットフォームの下にあるかにかかわらず、直接「」を使えばいいので、pythonは自動的にシステムによって異なるIDに変わります.
これらの理論的根拠があれば,本稿の先頭コードの「奇妙」現象を解析することができる.コード1では、テキストモードで開いているファイルは、改行IDがpythonで「」に処理され、バイナリモードで開いているファイルはそのままです.コード2では、バイナリモードで開き、テキストモードで書き込みます.バイナリが開くのはそのままで「r」ですが、テキストモードが書き込まれるとpythonが「'r」に変換するので、実は'rr'を書き込むのと同じなので、'^M'が増えてしまいます.
Open()関数でファイルを開くと、いくつかの開くモードがあります.
'r'->読み取り専用'w'->書き込みのみ、ファイルが存在する場合はクリア、存在しない場合は作成します.a'->追加、ファイル末尾'b'->バイナリモード、例えば画像、オーディオ、wordファイルを開く.'+'->更新(読み取り/書き込み可能)
この'+'号付きはちょっと理解しにくいので、上コードで感じてください.
with open('foo.txt', 'w+') as f:
f.write('bar
')
f.seek(0)
data = f.read()
上のコードは、書くだけでなく、読むこともできます.注意先頭、f.seek(0)にナビゲートします.そうしないと、空のデータが読み出されます.一部の人は迷っているかもしれませんが、'+'号が読める以上、'w+'は'r+'と何が違いますか.つまり、'w+'は空になり、作成されます(ファイルが存在する場合は空になり、存在しない場合は作成されます).r+'は空ではなく、作成しない
バイナリモードでテキストファイルを開かないで、次のコードの「怪しい」現象を見てください.Windowsの下にf.txtファイルがあるとします.中の内容は次のようです.
hello
world
コード1、
with open('f.txt', 'r') as f:
print f.readlines()
with open('f.txt', 'rb') as f:
print f.readlines()
しゅつりょく
['hello
', 'world
']
['hello\r
', 'world\r
']
コード2、
with open('f.txt', 'rb') as f:
data = f.read()
with open('f.txt', 'w') as f:
f.write(data)
ファイルを開くと、次のようになり、
hello^M
world^M
まず、改行文字「戻り文字」と「r」の概念を理解します.改行(LF,Line-Feed)は、新しい行を指します.'r',リターン記号(CR,Carriage-Return)は,行頭に戻ることを指す.
システムによって改行IDが異なるためです.
windows->'\r
'
unix->'
'
mac->'\r'
これがwindowsの下のtxtがlinuxが開いたときに行末に'^M'がある理由です.これは私がlinuxの下でスクリプトを走ってゲームのデータをエクスポートしてローカルwindowsに開いて1行になった理由です.
実はテキストファイルもバイナリファイルで、テキスト符号化のバイナリファイルで、テキストファイルはいくつかの非可視文字を処理して、可読性を増加しました.
pythonではos.linesepは、現在のシステムの改行IDを取得します.例えばwindowsの下でos.linesepは'r'です.pythonで改行IDを操作するときは、どのプラットフォームの下にあるかにかかわらず、直接「」を使えばいいので、pythonは自動的にシステムによって異なるIDに変わります.
これらの理論的根拠があれば,本稿の先頭コードの「奇妙」現象を解析することができる.コード1では、テキストモードで開いているファイルは、改行IDがpythonで「」に処理され、バイナリモードで開いているファイルはそのままです.コード2では、バイナリモードで開き、テキストモードで書き込みます.バイナリが開くのはそのままで「r」ですが、テキストモードが書き込まれるとpythonが「'r」に変換するので、実は'rr'を書き込むのと同じなので、'^M'が増えてしまいます.