ホームページ  >  記事  >  バックエンド開発  >  Python でのファイル処理の詳細な紹介

Python でのファイル処理の詳細な紹介

高洛峰
高洛峰オリジナル
2017-03-22 10:38:211541ブラウズ

Pythonでハードディスク上のファイルを操作したい場合、手順は大きく以下の3ステップに分かれます。

open関数を使ってファイルハンドルを開き、変数に代入します。

対応するファイルハンドルを通じて指定されたファイルを操作します。

操作が完了したら、ファイルを閉じます。ファイルの内容はディスクに書き込まれます。

open機能の使用方法は以下の通りです。

open('ファイルパス',mode='ファイルを開くモード',encoding='ファイルエンコード方法')

ファイルパス: このファイルパスは、Python では絶対パスまたは相対パスにすることができます。ファイル名を記述する必要があります。Python プログラムと開く必要のあるファイルが同じディレクトリにある場合は、相対パスを直接使用します。

注意! open 関数を使用する場合、ファイル パスは必須パラメータであり省略できません。

ファイルを開くモード: open 関数にはオプションの仮パラメータがあります。これは、ファイルを開くモードを定義するために使用されます。ファイルを開くモードが指定されていない場合、ファイルは r (read-) で開かれます。のみ) デフォルトのモード。

Python で提供される一般的なファイルを開くメソッドは次のとおりです:

「r」は読み取り専用モードでファイルを開きます。ファイルを開くには r (読み取り専用モード) を使用します。ファイルは読み取りのみ可能であり、開くことはできません。書かれた。 (ファイルが存在しない場合、例外がスローされます)

'w' は書き込み専用モードでファイルを開きます。ファイルを開くには w (書き込み専用モード) を使用します。ファイルは書き込みのみ可能で、読み取りはできません。 , しかし、特別な注意が必要なことが1つあります。 ! ! ! !元のコンテンツを含むファイルを w を使用して開くと、ファイルのコンテンツはクリアされます。 ! (理由については、この記事の後半で追加します。) (ファイルの元の内容をクリアしたくない場合は、絶対に w モードを使用しないでください!!!!!!) (ファイルが削除されたとき、ファイルが存在しない場合は、ファイルが作成されます。ファイルが存在する場合は、ファイルの内容が最初にクリアされます)

「a」追加モードは、売値の最後に内容を追加するために使用される書き込み専用モードでもあります。書き込まれた内容はファイルの末尾に追加されます

'b' バイナリ モード、バイナリ モードを使用してファイルを開きます、注意してください。この「b」(バイナリモード)は、3 つのモード(r、w、a)と組み合わせて使用​​されます。 (このモードは、クロスプラットフォームおよびクロスオペレーティング システムに推奨されます)

'r+' 読み取りおよび書き込み可能 (このモードでは、読み取りおよび書き込み可能ですが、書き込み時に注意する必要があります。シーク ポインターはまだ先頭にあります)シークポインタの位置を調整せずに直接書き込みを開始すると、以前に書き込んだ内容が直接上書きされます(ファイルの先頭から開始)。そのため、r+ モードを使用する場合は、注意が必要です。シーク ポインターの位置とファイル内の場所!! それ以外の場合は、元のコンテンツが上書きされます)

'w+' は書き込みと読み取りが可能です (このモードは通常は使用されず、ファイルは直接クリアされます) )

'a+' は書き込みと読み取りが可能です

. ファイル オブジェクトを操作するための一般的なメソッド

ファイルの読み取り:

readable() は、ファイルが読み取り可能であるかどうかを判断するために使用され、読み取り可能な場合は True を返し、そうでない場合は True を返します。 False を返します。

readline() はファイルを一度に 1 行ずつ読み取り、文字列型を返します。

read() は、ファイルのすべての内容を一度に読み取り、文字列全体を返します。

readlines() はファイルのすべての内容を読み取り、ファイルの各行をリストの要素として使用します。

ファイルの書き込み:

writable(): ファイルが書き込み可能かどうかを判断し、書き込み可能であれば True を返し、それ以外の場合は False を返します。

write(): ファイルにコンテンツを書き込みます。このメソッドは、ファイルが書き込み可能モードの場合にのみ使用できます。ファイルのどこに書き込むかは、ファイルのオープンモード (r+ か a+ か w+ か) によって決まります。また、現在のシーク ポインターがファイル内のどこを指しているかによっても異なります。 (さらに、write メソッドを使用してファイルの内部にコンテンツを書き込む場合、改行文字はありません。手動で改行文字を追加する必要があります。そうしないと、すべてのコンテンツがくっついてしまいます。)

例: f1。 write('hello!n' ) #n は改行文字です。

writelines(): wirte と同様に、write とは異なり、writelines はリストの形式を使用してファイルの内部にコンテンツを書き込みます。 list の各要素がファイルに書き込まれます。

注意! writelines を使用してファイル内のコンテンツを書き込む場合、各要素の末尾に改行文字を追加すると、リスト内の各要素はファイル内の 1 行になります。

注意! !ファイルに書き込まれるコンテンツは文字列のみであり、他のタイプは使用できません。 !そうしないと、数値を書き込む場合でも例外がスローされます。数値は文字列型に変換する必要があります。 ! !

その他の操作:​​

close() はファイルを閉じます。ファイルの読み取りまたは書き込みを行うときは、必ず close を使用してファイルを閉じてください。 (with 構文の使用を除きます。with キーワードを使用してファイルを開くと、ファイルに対する操作が完了した後にファイルが自動的に閉じられるためです)。

ファイルを読み取った後に閉じないと、プログラムはシステム リソースを占有し続けます。

書き込み後にファイルを閉じないと、メモリ内のコンテンツが時間内にハードディスクに同期されなくなります。コンテンツをハードディスクに完全に書き込みたい場合は、close を使用してファイルを閉じます。フラッシュメソッドを使用すると、メモリ内のデータがハードディスクにフラッシュされます。

flush() は、ハードディスクに書き込まれていないメモリ内のデータをハードディスクに強制的にフラッシュします。

encoding: 開いているファイルのエンコーディングを表示します (このメソッドは python2 では使用できませんが、python3 では使用できます。)

tell(): 現在のシーク ポインターの位置を取得できます。

seek (ポインター位置、モード) は、シーク ポインターをファイル内の位置にバイト単位で移動します。

Python でシーク ポインターを操作するには 3 つのモードがあります。これらの 3 つのモードについて詳しく説明します。

file.seek(n,0)#n はポインターの位置を表し、次の数字 0 は を表します。モードのシリアル番号。

file.seek(n,0): (モード 0) モード 0 は絶対位置を表し、n が数値の場合、ポインターはファイルの先頭から数えたバイトに移動します。 (シークを使用する場合、モードを指定しない場合、デフォルトのモードは 0 です。)

例えば、 file.seek(3,0) は、ポインタをファイルの先頭 (0 バイト目) の 3 バイト位置に移動します。 。

#ポインターを使用する前に

f1 = open('seasons.lrc',mode='r')

print f1.readline()

>>>浜AZakiあゆみ - Seasons

#以下is 0 モードを使用し、ポインタをファイルの 3 バイト目に移動した後、ファイルを読み取るときに、ファイルはポインタの後ろから読み取られます。

f1 = open('seasons.txt',mode='r')

print f1.tell() #シークポインタの現在位置を表示

>>>0 #(位置は0ですこれは、ポインターがファイルの先頭にあることを意味します)

f1.seek(3,0) #(ポインターを 3 番目のバイトに移動、0 モード、絶対位置を使用)

print f1.tell() #Seeポインタの位置を再度確認すると、ポインタの位置が確かに 3 バイト目に移動したことが確認できます。

>>>3

print f1.readline() #現在のポインターの位置から行を読み取ります。

>> 文字をスキップしましたか?

文字とバイトとは何か、この概念を明確にする必要があります。 ! UTF-8 の文字コードでは、漢字は 3 バイトを占有します。最初の行の元の内容は「浜崎由美-季節」です。漢字は 3 バイト占有するため、ポインタは 3 バイトだけ後ろに移動します。ファイルを読み込むと、「恂あゆみ」が表示されます。 (日本語の文字は、UTF-8 の文字コードでも 3 バイトを占めます。)

この例は、「絶対位置」の意味を理解するのに役立ちます。

f1 = open('seasons.lrc',mode='r')

print f1.tell() #ファイルを開いた後のポインターのデフォルトの位置は 0 です。

>>>0

f1.seek(3,0) #ファイル内の 3 バイトの位置に指を移動します。

print f1.tell()

>>>3

f1.seek(3,0)

print f1.tell()

>>>3

file.seek( n,1): (モード 1) モード 1、相対位置、n はポインタが現在位置から何バイト後方に移動するかを表します。

私が言ったことを理解するのが簡単ではないと思われる場合は、以下の例を見ればおそらく理解できるでしょう。

f1 = open('seasons.lrc',mode='r')

print f1.tell() #ファイルを開いた後のポインターのデフォルトの位置は 0 です。

>>>0

f1.seek(3,1) #ポインターを 3 バイト後方に移動します。

print f1.tell()

>>>3 #ポインタが3バイト目の位置に移動します。

f1.seek(3,1) #ここが重要なポイントで、ポインタを 3 バイト後方に移動します (ここでモード 1 とモード 0 の違いを比較できます。)

print f1.tell ()

> >>6 #ポインタの位置は 6 バイト目です。これは、1 モードが移動されるたびに、ファイルの先頭から開始するのではなく、ポインタの 2 番目のバイトが移動する位置に基づいていることも意味します。位置が特定され、後方に移動し始めます。 (これが「相対位置」の意味です。)

それでも理解できない場合は、以下の補足を読んでください。

最後に付け加えておきます:

f1.seek(3,0) は、ポインタをファイルの 3 バイト目に移動することを意味します。 (絶対位置)

f1.seek(3,1) は、ポインタを現在位置から 3 バイト後方に移動することを意味します。 (相対位置)

file.seek(-n,2): ファイルの末尾から開始してファイルの先頭まで移動する絶対位置を使用します。 (2 モードを使用する場合、ポインタの移動位置は負の数のみであることに注意する必要があります。ポインタは最後から開始して前に移動するためです。)

以下は例です:

#ファイルを開き、ファイルを最初から読み取るには read メソッドを使用します。ファイルの最後でファイルが読み取られると、ポインターは自然にファイルの最後に戻ります。

f1 = open('seasons.txt',mode='r')

print f1.tell()

>>>0

f1.read()

print f1.tell()

>>>756

これで、上記の方法により、ファイルのどのバイトがファイルの終わりであるかが分かりました。

シークメソッドの 2 つのモードの機能が前述したとおりであるかどうかをテストしてみましょう。ファイルの末尾から開始してファイルの先頭に移動します。

f1 = open('seasons.txt',mode='r')

print f1.tell()

>>>0

f1.seek(-1,2) #シーク 2 を使用モードでは、ポインタをファイルの末尾から 1 バイト前に移動します

print f1.tell()

>>>755

#ファイルの末尾は 756、1 ワード前に移動しましたノットは 755 , これにより、必要な効果が得られます。

実際、シークメソッドの 2 つのモードは非常に便利です。シークメソッドの 2 つのモードについて詳しく説明します。

ファイルの最終行から1行目からN行目までを取得するには、seekメソッドの2モードを使用できます。

このとき、ファイルの最後の行を取り出すのは、readlines メソッドを使用してファイルを読み出し、最後の要素を取得して最後の行を取得するだけの非常に簡単な操作ではないのかと疑問に思う人もいるかもしれません。 . この方法のほうが簡単ではないでしょうか?

こんな感じ。

f1 = open('seasons.txt',mode='r')

print f1.readlines()[-1]

>>>ファイルの終わり 確かに一行取り出しましたが、しかし、readlines を使用してファイルを読み取ることの本質は、ファイルが 10G や 100G など、大きすぎてメモリに収まらない場合に、そのファイルのすべての行をメモリに読み取ることです。この場合、この方法は適用できません。

次の方法は、特に大きなファイルに適しています。

f1 = open('seasons.txt',mode='r')

for i in f1: #Direct for ループ ファイル ハンドルは、ファイルを一度にメモリに読み取るのではなく、ファイルから 1 行を読み取ります。行。

line_bytes =-36

while:

f1.seek(line_bytes、2)data = f1.readlines() L BREAKs ELSE:

line_bytes * 2

以上がPython でのファイル処理の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。