【Python】ファイル読み込み【1行、全行、リスト】
ファイルを読み込む方法として、1行ずつ読み込んだり、全データをまとめて読み込んだり、また決まった文字数、バイト数ずつ読み込んだりといったことができる。
本記事では使用頻度が高い1行ずつ読み込み、全データ読み込みについて説明する。
- 1行ずつ読み込む
- 全行をまとめて読み込む
- 全行をまとめてリストとして読み込む
1行ずつファイルを読み込む
1行ずつファイルを読み込む方法はreadlineを使う方法とファイルオブジェクトをループさせる方法がある。
readlineで1行ずつ読み込む
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 line = f.readline()
5 print(line)
6# PassengerId,Pclass
改行コードまでデータが読み込まれる。
先頭から決まった行数だけに対して処理を行いたい場合に使うと便利かもしれない。
size指定とストリーム位置の変化について
引数で読み込む文字数を指定することが可能。
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 line = f.readline(5) # 1行目の先頭から5文字読み込む
5 print(line)
6 print(f"{f.tell()=}") # ストリーム位置が読み込んだ文字数分だけ進んでいる
7 line = f.readline(5) # 現在のストリーム位置から5文字読み込む
8 print(line)
9 print(f"{f.tell()=}") # ストリーム位置が読み込んだ文字数分だけ進んでいる
10 line = f.readline(50) # 指定したsizeが現在の行の残り文字数よりも少ないため、現在の行を全て読み込む
11 print(line)
12 # ストリーム位置が読み込んだ文字数分だけ進んでいる(改行コード(CRとLF)も1文字としてカウントされる)
13 print(f"{f.tell()=}")
14# Passe
15# f.tell()=5
16# ngerI
17# f.tell()=10
18# d,Pclass
19
20# f.tell()=20
指定した引数が負数の場合は1行全体を読み込む(デフォルトでは-1が設定されているので、1行全体を読み込む)。
指定した数値が現在の行の残り文字数よりも少ない場合、指定した文字数だけ読み込む。
1行ずつ、文字数指定でファイルを読み込む機会はあまりないかもしれないが、ファイル読み込みがどのように進んでいくかを理解するためには、知っておいても良いかもしれない。
本例ではテキストモードでファイルを読み込んでいるが、バイトモードの場合、バイト数を指定していることになる。
forループで1行ずつ読み込む
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 for line in f:
5 print(line)
6# PassengerId,Pclass
7#
8# 791,3
9#
10# 792,2
11#
12# 793,3
13#
14# 794,1
15#
16# 795,3
17#
18# 796,2
19#
20# 797,1
21#
22# 798,3
23#
24# 799,3
1行ずつ、全行に対して同じ処理をしたい場合に使うと便利。
全行をまとめて読み込む
readを使うことで、全行をまとめて読み込むことができる。
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 lines = f.read()
5 print(lines)
6# PassengerId,Pclass
7# 791,3
8# 792,2
9# 793,3
10# 794,1
11# 795,3
12# 796,2
13# 797,1
14# 798,3
15# 799,3
ファイル全体をまとめて読み込むため、ファイル同士で何か操作をしたい場合などに使うことが多い。
また引数に数字を指定することで、先頭から読み込む文字数を指定することが可能。
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 lines = f.read(5)
5 print(lines)
6# Passe
負数を指定すると全データが読み込まれる。(デフォルトのsizeは-1なので全データが読み込まれる)
ストリーム位置の進み方はreadlineで説明したのと同様の進み方となる。
全データをリスト形式で読み込む
listやreadlinesを使うことで、リストとして全データを読み込むことができる。
この方法で読み込むと改行コードも文字として読み込まれる。
list()を使う方法
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 print(list(f))
5# ['PassengerId,Pclass\n', '791,3\n', '792,2\n', '793,3\n', '794,1\n', '795,3\n', '796,2\n', '797,1\n', '798,3\n', '799,3\n']
readlines()を使う方法
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 lines = f.readlines()
5 print(lines)
6# ['PassengerId,Pclass\n', '791,3\n', '792,2\n', '793,3\n', '794,1\n', '795,3\n', '796,2\n', '797,1\n', '798,3\n', '799,3\n']
listもreadlinesも同じ操作で、コードも大して変わらないため、どちらを使っても良い。
どちらの方法も、改行コードも文字列として読み込まれることに注意。
改行コードを含まないリストを作成する
改行コードを含ませたくない場合、ファイル全体を読み込み、改行コードで分割してやるといい。
1filepath = "./data/sample_data.csv"
2
3with open(filepath, "r", encoding="utf-8") as f:
4 lines = f.read().split('\n')
5 print(lines)
6# ['PassengerId,Pclass', '791,3', '792,2', '793,3', '794,1', '795,3', '796,2', '797,1', '798,3', '799,3', '']
改行コードを含まないリストを作成できる。