ファイルを1行ずつリストに読み込む方法は?

2010年07月19日に質問されました。  ·  閲覧回数 3.8M回  ·  ソース

Julie Raswick picture
2010年07月19日

Pythonでファイルのすべての行を読み取り、各行を要素としてリストに保存するにはどうすればよいですか?

ファイルを1行ずつ読み取り、各行をリストの最後に追加したいと思います。

回答

SilentGhost picture
2010年07月19日
2264
with open(filename) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 
Felix Kling picture
2010年07月19日
1039

入力と出力を参照してください:

with open('filename') as f:
    lines = f.readlines()

または改行文字を削除します。

with open('filename') as f:
    lines = [line.rstrip() for line in f]
robert picture
2010年07月19日
618

これは必要以上に明確ですが、必要なことを実行します。

with open("file.txt") as file_in:
    lines = []
    for line in file_in:
        lines.append(line)
Noctis Skytower picture
2010年07月19日
280

これにより、ファイルから行の「配列」が生成されます。

lines = tuple(open(filename, 'r'))

openは、反復可能なファイルを返します。 ファイルを反復処理すると、そのファイルから行を取得します。 tupleはイテレータを取得し、指定したイテレータからタプルインスタンスをインスタンス化できます。 linesは、ファイルの行から作成されたタプルです。

Eneko Alonso picture
2014年03月02日
208

\n含めたい場合:

with open(fname) as f:
    content = f.readlines()

\n含めたくない場合:

with open(fname) as f:
    content = f.read().splitlines()
Pedro Lobito picture
2015年04月20日
176

Pythonのファイルオブジェクトlistに変換する最も簡単な方法は次のとおりです。

with open('file.txt') as f:
    my_list = list(f)

テキストファイルの行を繰り返す必要がある場合は、次を使用できます。

with open('file.txt') as f:
    for line in f:
       ...

古い答え:

withreadlines()

with open('file.txt') as f:
    lines = f.readlines()

ファイルを閉じる必要がない場合は、このワンライナーが機能します。

lines = open('file.txt').readlines()

従来の方法:

f = open('file.txt') # Open file on read mode
lines = f.read().split("\n") # Create a list containing all lines
f.close() # Close file
DevShark picture
2016年02月25日
156

提案されているように、単純に次のことを行うことができます。

with open('/your/path/file') as f:
    my_lines = f.readlines()

このアプローチには2つの欠点があることに注意してください。

1)すべての行をメモリに保存します。 一般的な場合、これは非常に悪い考えです。 ファイルが非常に大きくなり、メモリが不足する可能性があります。 大きくなくても、単にメモリの無駄です。

2)これはあなたがそれらを読むときに各行の処理を許可しません。 したがって、この後に行を処理する場合、効率的ではありません(1つではなく2つのパスが必要です)。

一般的なケースのより良いアプローチは次のとおりです。

with open('/your/path/file') as f:
    for line in f:
        process(line)

プロセス関数を好きなように定義する場所。 例えば:

def process(line):
    if 'save the world' in line.lower():
         superman.save_the_world()

Supermanクラスの実装は、演習として残されています)。

これはどのファイルサイズでもうまく機能し、1回のパスでファイルを処理します。 これは通常、汎用パーサーがどのように機能するかです。

Giovanni G. PY picture
2017年04月26日
89

リストへのデータ

次の行のように、データを含むテキストファイルがあるとします。

テキストファイルの内容:

line 1
line 2
line 3
  • 同じディレクトリでcmdを開きます(マウスを右クリックして、cmdまたはPowerShellを選択します)
  • pythonを実行し、インタプリタに次のように記述します。

Pythonスクリプト:

>>> with open("myfile.txt", encoding="utf-8") as file:
...     x = [l.rstrip("\n") for l in file]
>>> x
['line 1','line 2','line 3']

追加の使用:

x = []
with open("myfile.txt") as file:
    for l in file:
        x.append(l.strip())

または:

>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1', 'line 2', 'line 3']

または:

>>> x = open("myfile.txt").readlines()
>>> x
['linea 1\n', 'line 2\n', 'line 3\n']

または:

def print_output(lines_in_textfile):
    print("lines_in_textfile =", lines_in_textfile)

y = [x.rstrip() for x in open("001.txt")]
print_output(y)

with open('001.txt', 'r', encoding='utf-8') as file:
    file = file.read().splitlines()
    print_output(file)

with open('001.txt', 'r', encoding='utf-8') as file:
    file = [x.rstrip("\n") for x in file]
    print_output(file)

出力:

lines_in_textfile = ['line 1', 'line 2', 'line 3']
lines_in_textfile = ['line 1', 'line 2', 'line 3']
lines_in_textfile = ['line 1', 'line 2', 'line 3']
MSeifert picture
2018年01月17日
43

ファイルをリストに読み込むには、次の3つのことを行う必要があります。

  • ファイルを開く
  • ファイルを読む
  • 内容をリストとして保存する

幸い、Pythonを使用するとこれらの操作が非常に簡単になるため、ファイルをリストに読み込む最短の方法は次のとおりです。

lst = list(open(filename))

ただし、もう少し説明を追加します。

ファイルを開く

特定のファイルを開きたいが、ファイルハンドル(またはファイルのようなハンドル)を直接処理しないことを前提としています。 Pythonでファイルを開くために最も一般的に使用される関数はopenで、Python2.7では1つの必須引数と2つのオプション引数を取ります。

  • ファイル名
  • モード
  • バッファリング(この回答ではこの引数を無視します)

ファイル名は、ファイルへのパスを表す文字列である必要が

open('afile')   # opens the file named afile in the current working directory
open('adir/afile')            # relative path (relative to the current working directory)
open('C:/users/aname/afile')  # absolute path (windows)
open('/usr/local/afile')      # absolute path (linux)

ファイル拡張子を指定する必要があることに注意してください。 .txt.docなどのファイル拡張子は、エクスプローラーで表示するとデフォルトで非表示になるため、これはWindowsユーザーにとって特に重要です。

2番目の引数はmode 、デフォルトではr 、これは「読み取り専用」を意味します。 それはまさにあなたがあなたの場合に必要なものです。

ただし、実際にファイルを作成したり、ファイルに書き込んだりする場合は、ここで別の引数が必要になります。 概要が必要な場合は、優れた回答があります

ファイルを読み取る場合は、 modeを省略するか、明示的に渡すことができます。

open(filename)
open(filename, 'r')

どちらもファイルを読み取り専用モードで開きます。 Windowsでバイナリファイルを読み込みたい場合は、モードrbを使用する必要があります。

open(filename, 'rb')

他のプラットフォームでは、 'b' (バイナリモード)は単に無視されます。


ファイルをopenする方法を示したので、常にcloseする必要があるという事実について話しましょう。 それ以外の場合は、プロセスが終了するまで(または、Pythonがファイルハンドルをガベージするまで)、ファイルに対して開いているファイルハンドルを保持します。

あなたが使用できる間:

f = open(filename)
# ... do stuff with f
f.close()

openclose間の何かが例外をスローした場合、ファイルを閉じることができません。 tryfinallyを使用することで、これを回避できます。

f = open(filename)
# nothing in between!
try:
    # do stuff with f
finally:
    f.close()

ただし、Pythonは、よりきれいな構文を持つコンテキストマネージャーを提供します(ただし、 openの場合、上記のtryおよびfinallyとほぼ同じです)。

with open(filename) as f:
    # do stuff with f
# The file is always closed after the with-scope ends.

最後のアプローチは、Pythonでファイルを開くための推奨されるアプローチです。

ファイルの読み取り

さて、あなたはファイルを開きました、今それを読む方法は?

open関数はfileオブジェクトを返し、Pythonの反復プロトコルをサポートします。 反復ごとに次の行が表示されます。

with open(filename) as f:
    for line in f:
        print(line)

これにより、ファイルの各行が印刷されます。 ただし、各行の最後に改行文字\nが含まれることに注意してください(Pythonがユニバーサル改行サポートで構築されているかどうかを確認することをお勧めします-そうでない場合は、Windowsまたは\r \r\nを使用することもできます改行としてMacでは\r )。 それを望まない場合は、最後の文字(またはWindowsでは最後の2文字)を削除するだけで済みます。

with open(filename) as f:
    for line in f:
        print(line[:-1])

ただし、最後の行には必ずしも末尾の改行が含まれているとは限らないため、これを使用しないでください。 末尾の改行で終わっているかどうかを確認し、終わっている場合は削除します。

with open(filename) as f:
    for line in f:
        if line.endswith('\n'):
            line = line[:-1]
        print(line)

ただし、文字列\n文字を含む)を削除するだけで済みます。これ末尾の空白も削除されるため、これらが重要である場合は注意する必要があります。

with open(filename) as f:
    for line in f:
        print(f.rstrip())

ただし、行が\r\n (Windowsの「改行」)で終わる場合、その.rstrip()\rます。

内容をリストとして保存する

ファイルを開いて読み取る方法がわかったので、次はコンテンツをリストに保存します。 最も簡単なオプションは、 list関数を使用することです。

with open(filename) as f:
    lst = list(f)

末尾の改行を削除したい場合は、代わりにリスト内包表記を使用できます。

with open(filename) as f:
    lst = [line.rstrip() for line in f]

またはさらに単純です: fileオブジェクトの.readlines()メソッドは、デフォルトで次の行のlistを返します。

with open(filename) as f:
    lst = f.readlines()

これには末尾の改行文字も含まれます。不要な場合は、すべての行を含む2つのリストをメモリに保持しないため、 [line.rstrip() for line in f]アプローチをお勧めします。

目的の出力を取得するための追加オプションがありますが、それはむしろ「最適ではありません」: readファイル全体を文字列に入れてから改行で分割します。

with open(filename) as f:
    lst = f.read().split('\n')

または:

with open(filename) as f:
    lst = f.read().splitlines()

split文字が含まれていないため、これらは末尾の改行を自動的に処理します。 ただし、ファイルを文字列および行のリストとしてメモリに保持するため、理想的ではありません。

概要

  • ファイルを開くときはwith open(...) as f使用します。これは、ファイルを自分で閉じる必要がなく、何らかの例外が発生した場合でもファイルを閉じるためです。
  • fileオブジェクトは反復プロトコルをサポートしているため、ファイルを1行ずつ読み取るのはfor line in the_file_object:と同じくらい簡単です。
  • 使用可能な関数/クラスについては、常にドキュメントを参照してください。 ほとんどの場合、タスクに完全に一致するか、少なくとも1つまたは2つの適切なタスクがあります。 この場合の明白な選択はreadlines()が、リストに格納する前に行を処理したい場合は、単純なリスト内包表記をお勧めします。
Johnny picture
2014年12月21日
42

ファイルの行をリストに読み込むクリーンでPythonicな方法


何よりもまず、ファイルを開いてその内容を効率的かつPythonの方法で読み取ることに集中する必要があります。 これは私が個人的に好まない方法の例です:

infile = open('my_file.txt', 'r')  # Open the file for reading.

data = infile.read()  # Read the contents of the file.

infile.close()  # Close the file since we're done using it.

代わりに、私は読み取りと書き込みの両方でファイルを開く以下の方法を好みます。これは非常にクリーンであり、使用が終了したらファイルを閉じるという追加の手順を必要としないためです。 以下のステートメントでは、読み取り用にファイルを開いて、変数「infile」に割り当てています。 このステートメント内のコードの実行が終了すると、ファイルは自動的に閉じられます。

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

ここで、このデータは反復可能で効率的で柔軟性があるため、 Pythonリストに取り込むことに焦点を当てる必要があります。 あなたの場合、望ましい目標は、テキストファイルの各行を別々の要素にすることです。 これを実現するために、 splitlines()メソッドを次のように使用します。

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

最終製品:

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

コードのテスト:

  • テキストファイルの内容:
     A fost odatã ca-n povesti,
     A fost ca niciodatã,
     Din rude mãri împãrãtesti,
     O prea frumoasã fatã.
  • テスト目的でステートメントを印刷します。
    print my_list  # Print the list.

    # Print each line in the list.
    for line in my_list:
        print line

    # Print the fourth element in this list.
    print my_list[3]
  • 出力(Unicode文字のために外観が異なります):
     ['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
     'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
     frumoas\xc3\xa3 fat\xc3\xa3.']

     A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
     împãrãtesti, O prea frumoasã fatã.

     O prea frumoasã fatã.