ホームページ >バックエンド開発 >Python チュートリアル >Python ファイル読み取り操作の詳細な紹介
この記事では、Python のファイル読み取り操作について詳しく説明します。参考になるものがあります。困っている友人は参考にしてください。お役に立てれば幸いです。
ファイルを読み取るための操作手順
象を冷蔵庫に入れる手順を尋ねる頭の体操があります。答えは非常に簡単です。冷蔵庫を開けて、象を入れる 押し込んで冷蔵庫を閉めます。これは問題に対処するためのアイデアです。ファイルに対する操作は同じです。最初のステップ: ファイルを開きます。第 2 ステップ: ファイルを処理します (読み取りまたは書き込み)。第 3 ステップはファイルを閉じます。方法それについて?実はとても簡単なので、ファイル操作について詳しく説明していきます。
ファイルを開く
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
ファイルを開くには、open() 関数を使用する必要があります。() に含まれるパラメータは、次の 3 つのパラメータだけを知っている必要があります。最初の段階は、ファイル、モード、エンコーディングです
#file
#最初はファイル名、タイプは文字列、パスは次のとおりです。開くファイルが現在のファイルと同じファイルにある場合 ディレクトリ内の場合はパス(相対パス)を省略できます。 #ファイルを開くためのモードです。形式は次のとおりです: mode='mode'、ここで「mode=」は省略できます。モードを直接記述します。モードが指定されていない場合、デフォルトは r です。特定のモードは次のとおりです。ここでは、疑似名詞であるポインターを紹介します。Word でテキストを編集するときに、カーソルがあると想像してみてください。ポインタは、ファイルに対するすべての操作が開始されるカーソルと考えることができます。
r 只读。文件的初始指针在文件的开头。这是默认模式。 rb 只读的二进制格式。文件的初始指针在文件的开头。 r+ 读写。文件的初始指针在文件的开头。 rb+ 读写的二进制格式。文件的初始指针在文件的开头。 w 只写。如果该文件已存在则打开文件,清空文件内容。如果该文件不存在,则创建新文件。 wb 只写的二进制格式。如果该文件已存在则打开文件,清空文件内容。如果该文件不存在,创建新文件。 w+ 写读。如果该文件已存在则打开文件,清空文件内容。如果该文件不存在,创建新文件。 wb+ 写读的二进制格式。如果该文件已存在则打开文件,清空文件内容。如果该文件不存在,创建新文件。 a 追加写。如果该文件存在,文件的初始指针在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab 追加写的二进制格式。如果该文件存在,文件的初始指针在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+ 追加写读。如果该文件已存在,文件的初始指针在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 追加写读的二进制格式。如果该文件已存在,文件的初始指针在文件的结尾。如果该文件不存在,创建新文件用于读写。
encoding
3 番目のパラメータは、ファイルのエンコーディング (非バイナリ形式で使用) です。エンコーディング設定は、ファイルのエンコーディングと一致している必要があります。開かれない場合、エラーが報告されます。これは、ソース ファイルがどのエンコーディングで書かれているかを意味し、ファイルを開くときにどのエンコーディングを使用する必要があるかを示します。
ファイルの処理
エラーの例を示します。実装される操作は、「test」という名前のファイルを開くことです。元のファイル エンコーディングは utf- 8. で、開くときに gbk エンコードを使用しました。その文書には一文しかありません: 10 歩で 1 人を殺し、1,000 マイルに痕跡を残さない。
コードは次のとおりです:file = open('test','r',encoding='gbk') content = file.read() print(content) file.close()次の手順は次のとおりです。open 関数によって返された結果はファイル オブジェクトなので、それを受け取るには変数を使用する必要があります (ファイル)。これにより、このオブジェクトを file.read()、file.write、file.flush() などのメソッドで便利に使用できるようになります。 read() は、ファイル オブジェクトのメソッドです。その機能は読み取りです。指定された文字数。指定されていない場合は、デフォルトで読み込まれます。すべてのコンテンツを取得します。
ただし、上記のコードを実行するとエラーが報告されます。以下はエラー メッセージです。主な考え方は、gbkエンコードをデコードできません (ファイルを開くプロセスが実際にはデコード プロセスです)
--------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) <ipython-input-78-bb879f008680> in <module>() 4 #这里说明以下,open函数返回的结果是一个文件对象,所以要用一个变量接收一下(file),这样我们就可以方便地使用这个 5 #对象的方法了,比如file.read(),file.write,file.flush()等等 ----> 6 content = file.read()#read()是文件对象的一个方法,作用是读取指定的字符数,如果未指定则默认读取所有内容 7 print(content) 8 file.close() UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 4: illegal multibyte sequence
file = open('test') content = file.read() print(content) file.close() 输出为: 十步杀一人,千里不留行
file = open('test') content = file.read(3) print(content) file.close() 输出为: 十步杀
with open() as file_name: 操作代码......
このメソッドを使用する利点は、ファイルを閉じるためのステートメントを記述する必要がないことです。キーワードと同様に、形式を覚えておいてください。
次にバイナリ形式のファイルを作成します
with open('二进制','wb') as file: file.write('十步杀一人,千里不留行'.encode('utf8'))
ファイルを開く方法はバイナリ形式であるため、ファイルを書き込むときに文字列を書き込む必要があります。バイナリ形式ですが、「十歩で人を殺し、千マイルに痕跡を残さない」の場合、「この文字列のバイナリ形式は何ですか?」分からないので、.encode(utf8) を使用してこの文字列をバイナリ形式に変換します。実際、この文字列に対応するバイナリ形式は、別のコードを通じて知ることができます。コードは次のとおりです:
print('十步杀一人,千里不留行'.encode('utf8')) 输出的二进制格式(表现形式为16进制,为什么?因为二进制太长了啊!!!)为: b'\xe5\x8d\x81\xe6\xad\xa5\xe6\x9d\x80\xe4\xb8\x80\xe4\xba\xba\xef\xbc\x8c\xe5\x8d\x83\xe9\x87\x8c\xe4\xb8\x8d\xe7\x95\x99\xe8\xa1\x8c'
在实际中我们当然不可能写这么长的东西,所以我们使用.encode('utf8')来转化。转化时我们使用了utf-8的编码方式。
在这里说明一下为什么要编码,想弄清楚这件事就要明白计算机的存储原理。
简单地讲,文件在计算机中都是以二进制格式存储的,对于计算机来讲只有两个数字有意义,那就是0和1,也就是二进制,而不同的0和1的组合代表不同的含义(编码不同),比如在gbk编码下一个汉字由两个字节表示,也就是16位二进制数(16个0和1的组合),而在utf-8编码下一个汉字由3个字节表示,也就是24位二进制数(24个0和1的组合),而我们现在要给计算机存储的就是0和1的组合,那么在读取文件或者转化字符串时,如果你不告诉计算机你使用的是哪种编码的话,计算机怎么可能知道这些0和1的组合代表什么含义呢?所以从计算机取出数据或者把普通字符串转化成二进制格式时你必须告诉计算机你使用的是什么编码方式。
在本例中使用utf-8编码,所以在字符串后面加上.encode(utf8)
那么为什么平时可以直接写入普通字符串呢?那是因为在用open()函数打开文件的时候就已经指定了编码方式。
形象地解释:open函数相当于打开了一种通道,平时打开时都是用某种编码的方式打开的,所以我们在写入内容时不必管它以什么编码进入通道的(因为在open函数里面就已经指定了编码方式)
而当open函数使用二进制格式打开时(就是带b的模式),这个通道就没有指定编码方式,通道里面只有二进制,所以此时往通道里面放入非二进制格式内容的话就需要指定一种编码方式。除非你直接在file.write()函数中直接写二进制,但是人类是不可能记住那么多二进制组合所代表的含义的。
然后我们来读取一下上面创建的名字为“二进制”的这个文件
with open('二进制','rb') as file: print('不指定解码方式时的结果:',file.read())
如果我们在读取时不指定解码方式,那么输出的结果就是下面这种人类无法理解的奇怪的东西(实际上它是用16进制表示的二进制)
不指定解码方式时的结果: b'\xe5\x8d\x81\xe6\xad\xa5\xe6\x9d\x80\xe4\xb8\x80\xe4\xba\xba\xef\xbc\x8c\xe5\x8d\x83\xe9\x87\x8c\xe4\xb8\x8d\xe7\x95\x99\xe8\xa1\x8c'
所以我们在读取时也要指定编码:
with open('二进制','rb') as file: content = file.read() print('指定解码方式后的结果:',content.decode('utf-8')) 指定解码方式后的结果: 十步杀一人,千里不留行
其他的在读取时可能用到的方法:
readline()读取一行,如果里面添加了参数n,则会读取n个字符(我觉得这是个bug,貌似没什么卵用) readlines()读取所有内容,结果返回一个列表,元素由每一行组成。 tell()会输出当前指针的位置,注意,该位置是以字节来计算的,不是字符 seek()重新指定指针位置。
使用readlines()并不是一个好方法,因为是一次性将文件都读取到内存中,如果文件较大时则造成内存溢出,实际中使用下面的方法,系统会自动生成一个迭代器,用迭代的方法把需要的数据取出来。
with open('libai') as f: for i in f: #这里的i实际就是迭代后的每一行,用for循环的方式从文件对象中取出来,取一行读一行,节省内存 print(i)
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。 十步杀一人,千里不留行。事了拂衣去,深藏身与名。 闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。 三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。 救赵挥金锤,邯郸先震惊。千秋二壮士,烜赫大梁城。 纵死侠骨香,不惭世上英。谁能书阁下,白首太玄经。
关闭文件
如果用with open() 来打开文件的话就不用管关闭文件的操作了,因为Python已经帮你完成了这一步,否则必须在处理文件之后加上关闭文件的操作:file_name.close()
以上がPython ファイル読み取り操作の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。