前回の記事「手をつないでPythonを学ぶ」31-ファイルを開くでは、ファイルを開く方法を学びました。今日もファイル操作の研究を続けており、いくつかのファイル読み取り方法の説明に焦点を当てます。
ここでもう1つ言いましょう。将来、より高度なファイル操作方法を学ぶときは、pandsa.read_csvなどのコマンドを使用してファイルを読み取る可能性があります。ただし、この記事で紹介するPython処理ファイルの基本原則を理解することも非常に重要です。
Pythonでファイルを読み取る方法はたくさんありますが、以下に1つずつ紹介しましょう。
1.ファイル全体を読みます
前回の記事では、open()関数がイテレータのみを返すことを確認しました。現時点では、ファイルを読み取るためにread()メソッドが必要です。使用するメソッドは、以前に使用したさまざまなメソッドと同じです。追加するだけです。 「。」とオブジェクトの後のメソッド名を入力すると、ファイル全体を読み取ることができます。
In [1]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8').read()
print(file_object)
Out[1]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
開いたターゲットファイルをread()メソッドで読み取った後、目的の効果を出力できます。
この出力結果は元のファイルと同じように見えますが、実際には少し異なります。つまり、出力結果の最後に余分な空白行があります。
余分な空白行があるのはなぜですか?ターゲットファイルでは、テキストの最後の行の後に改行があるため、read()はファイルの終わりに達すると自動的に空の文字列を返し、改行とこの空の文字列は表示されると空白行になります。この余分な空白行を削除するには、1つの方法は、ターゲットファイルを作成するときに最後の改行を回避することであり、もう1つの方法は、前に学習したstring.rstrip(str)メソッドを使用して文字列をインターセプトすることです。右側の指定された文字( end)(strはデフォルトでスペースです)。
この方法でプログラムを再度変更すると、ターゲットファイルの内容と完全に一致する結果を得ることができます。
In [2]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8').read()
print(file_object.rstrip())
Out[2]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
さらに、encodingパラメーターを使用せずに漢字を読み取るとどうなるかを確認できます。
In [3]: path = 'lesson/text/contents.txt'
file_object = open(path).read()
print(file_object)
Out[3]: ---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-10-38447936f978> in <module>
1 path = 'lesson/text/contents.txt'
----> 2 file_object = open(path).read()
3 print(file_object)
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 14: illegal multibyte sequence
ターゲットファイルに漢字が含まれているが、エンコーディングパラメータが使用されていない場合、gbk文字をデコードできないというエラーが発生することがわかります。
ほとんどの場合、ファイルには中国語の句読点を含む漢字が含まれているため、open()関数を使用するときは、パラメーター「encoding = 'utf-8'」を追加することをお勧めします。間違いをしないように注意してください。コーディングの問題のため。
ファイルのエンコーディングがわからない場合は、sysモジュールをインポートし、getdefaultencoding()メソッドを使用してファイルのデフォルトのエンコーディングを確認できますが、これは私たちが学んだことを超えているためです。
2.イテレータを使用して、ファイルを1行ずつ読み取ります
開いたファイルはイテレータを返すため、ファイル全体を読み取るだけでなく、forループステートメントを使用してファイルを1行ずつ読み取ることもできます。これは、リストをトラバースするのと同じくらい簡単です。出力結果は、ターゲットの各行です。ファイル。
In [4]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
for line in file_object:
print(line)
Out[4]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
ご覧のとおり、1行ずつ読み取りおよび印刷する場合、出力には空白行が多くなるため、rstrip()も必要です。
In [5]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
for line in file_object:
print(line.rstrip())
Out[5]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
以前に学習したリスト内包表記を使用すると、上記のプログラムがより簡単になります。
In [6]: path = 'lesson/text/contents.txt'
print([x for x in open(path, encoding = 'utf-8')])
Out[6]: ['《手把手陪您学Python》1——为什么要学Python?\n', '《手把手陪您学Python》2——Python的安装\n', '《手把手陪您学Python》3——PyCharm的安装和配置\n', '《手把手陪您学Python》4——Hello World!\n', '《手把手陪您学Python》5——Jupyter Notebook\n', '《手把手陪您学Python》6——字符串的标识\n', '《手把手陪您学Python》7——字符串的索引\n', '《手把手陪您学Python》8——字符串的切片\n', '《手把手陪您学Python》9——字符串的运算\n', '《手把手陪您学Python》10——字符串的函数\n']
リスト内包表記は、ターゲットファイルの各行の内容と改行文字を要素として取り、リストを形成します。したがって、すべての要素の後に改行エスケープ文字が続きます。前の例の結果にエスケープ文字が含まれていなかった理由は、print()関数が使用されているためです。前の例でprint()関数を使用して印刷しない場合、改行のためのエスケープ文字があります。試してみてください。 。
このエスケープ文字を削除する場合は、rstrip()メソッドを使用することもできます。
In [7]: path = 'lesson/text/contents.txt'
print([x.rstrip() for x in open(path, encoding = 'utf-8')])
Out[7]: ['《手把手陪您学Python》1——为什么要学Python?', '《手把手陪您学Python》2——Python的安装', '《手把手陪您学Python》3——PyCharm的安装和配置', '《手把手陪您学Python》4——Hello World!', '《手把手陪您学Python》5——Jupyter Notebook', '《手把手陪您学Python》6——字符串的标识', '《手把手陪您学Python》7——字符串的索引', '《手把手陪您学Python》8——字符串的切片', '《手把手陪您学Python》9——字符串的运算', '《手把手陪您学Python》10——字符串的函数']
open()の後にファイルを1行ずつ読み取る場合、生成されたイテレータは1回しか使用できないことに注意してください。行ごとに読み取るプロセスでは、ポインタが自動的に先頭に戻るのではなく、ファイルの先頭から末尾に移動するためです。したがって、forループを使用して行ごとに読み取る場合、使用できるのは1回だけです。
3. readlines()メソッドを使用して、行ごとに読み取ります
forループを使用して行ごとに読み取るだけでなく、readlines()メソッドを使用することもできます。このとき、返されるのは各行の内容で構成されるリストです。これは、forループを使用するよりも簡単です。リストを生成します。
In [8]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8').readlines()
print(file_object)
Out[8]: ['《手把手陪您学Python》1——为什么要学Python?\n', '《手把手陪您学Python》2——Python的安装\n', '《手把手陪您学Python》3——PyCharm的安装和配置\n', '《手把手陪您学Python》4——Hello World!\n', '《手把手陪您学Python》5——Jupyter Notebook\n', '《手把手陪您学Python》6——字符串的标识\n', '《手把手陪您学Python》7——字符串的索引\n', '《手把手陪您学Python》8——字符串的切片\n', '《手把手陪您学Python》9——字符串的运算\n', '《手把手陪您学Python》10——字符串的函数\n']
readlines()メソッドを使用する場合、ポインターの移動によっても読み取られるため、上記のforループと同様に、readlines()メソッドは1回しか使用できません。
4.指定された文字を読み取ります
read()メソッドを使用してファイル全体を読み取るだけでなく、パラメーターを入力するときに、指定した文字数を最初から読み取ることもできます。文字数はパラメーターです。
In [9]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8').read(100) # 读取100个字符
print(file_object)
Out[9]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Pytho
5.ポインタの位置を返します
ちょうど今、ポインタの動きについて何度も話しましたが、ファイルを読み取るプロセスは、実際にはポインタまたはハンドルの前進によって実現されます。
デフォルトでは、read()メソッドはファイルの最初の文字から始まります(ポインターも最初の文字の位置にあります)。最後に、ポインターは自動的に次の文字の位置に移動し、次の読み取り命令。
tell()メソッドを介して、ポインタの現在の位置を返すことができます。
In [10]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
print(file_object.read(8))
file_object.tell()
Out[10]: 《手把手陪您学P
22
UTF-8形式では、各漢字と句読点は3バイトを占めます。したがって、上記の例では、読み取りが8文字を読み取る場合、7つの漢字(中国語の記号を含む)を含む8文字が21バイトを占め、1つの英語が1バイトを占めるため、最終的なポインター位置は22バイトになります。
ポインターを使用して、forループは1回しか使用できないという原則を確認できます。
In [11]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
for line in file_object:
print(line.rstrip())
file_object.tell()
Out[11]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
575
トラバーサル後、ポインタは上記のように記事の最後に移動します。このとき、575バイトの位置では、計算方法は上記と同じであるため、forループを使用してトラバースすることはできなくなります。 readlines()メソッドを使用します。
6.ポインタを指定された位置に移動します
ポインタの位置を自分で制御する場合は、seek()メソッドを使用してポインタを指定した位置に移動し、read()メソッドと連携してファイルの残りの部分または指定した文字数を読み取ることができます。 。
In [12]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
file = file_object.seek(22)
file_object.tell()
print(file_object.read())
Out[12]: ython》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
上記の例では、最初にseek()メソッドを使用してポインターを22バイトの位置(前の例と同じ位置)に移動し、次にtell()メソッドを使用して検証し、最後にread()メソッドを使用しますポインタ位置を読み取るには。の後の残りのコンテンツ。
seek()を使用してポインタを移動する場合、漢字が含まれる場合、漢字のバイトを分離できないことに注意してください。たとえば、ターゲットファイルの最初の文字は中国語の「」で、3バイトを占めます。seek()1または2だけの場合は問題ありませんが、ポインタを1バイトまたは2に移動する場合は問題ありません。文字セクションの位置を後で印刷すると、エラーが報告されます。
In [13]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
file = file_object.seek(2)
print(file_object.read())
Out[13]: ---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-76-27e34aade1ea> in <module>
2 file_object = open(path, encoding = 'utf-8')
3 file = file_object.seek(2)
----> 4 print(file_object.read())
~\anaconda3\lib\codecs.py in decode(self, input, final)
320 # decode input (taking the buffer into account)
321 data = self.buffer + input
--> 322 (result, consumed) = self._buffer_decode(data, self.errors, final)
323 # keep undecoded input until the next call
324 self.buffer = data[consumed:]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8a in position 0: invalid start byte
エラーの内容は、ポインタが漢字で占められている連続したバイトの位置の真ん中にある場合、それをデコードできないことです。
同様に、seek()を使用すると、forループがファイルをトラバースした後、ポインターを初期位置に移動することで、再度トラバースできます。
In [14]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
for line in file_object:
print(line.rstrip())
file_object.seek(0)
for line in file_object:
print(line.rstrip())
Out[14]: 《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
上記はPythonでファイルを読み取るためのいくつかの基本的な方法です。皆さんがそれらをよく理解してくれることを願っています。これは、後でより高度なファイル読み取り操作を学ぶのに役立ちます。
次の記事では、ファイルを閉じて書き込む方法を紹介しますので、ご期待ください。
この記事を読んでくれてありがとう!ご不明な点がございましたら、メッセージを残してご相談ください^ _ ^
「手をつないでPythonを学ぶ」シリーズの他の記事を読むには、公式アカウントに従ってメニュー選択をクリックするか、以下のリンクをクリックして直接アクセスしてください。
「手をつないでPythonを学ぶ」1-なぜPythonを学ぶのか?
「手をつないでPythonを学ぶ」2-Pythonのインストール
「手をつないでPythonを学ぶ」3-PyCharmのインストールと構成
「手をつないでPythonを学ぶ」4-HelloWorld!
「手をつないでPythonを学ぶ」5-JupyterNotebook
「手をつないでPythonを学ぶ」11-文字列のフォーマットされた出力
「手をつないでPythonを学ぶ」14-インタラクティブな入力
「手をつないでPythonを学ぶ」23-組み込みシーケンス関数
「手をつないでPythonを学ぶ」27-カスタム関数のパラメーター
「手をつないでPythonを学ぶ」28-カスタム関数の戻り値
ファンの方へ:「Pythonも言った」パブリックアカウントをフォローし、「Hand 32」に返信して、この記事で使用されているサンプル文を無料でダウンロードしてください。