テキストファイルをPythonでリストまたは配列に読み込む方法


175

テキストファイルの行をpythonのリストまたは配列に読み込もうとしています。作成後、リストまたは配列内のアイテムに個別にアクセスできるようにする必要があります。

テキストファイルの形式は次のとおりです。

0,0,200,0,53,1,0,255,...,0.

...上記の場合、実際のテキストファイルには数百または数千の項目があります。

次のコードを使用して、ファイルをリストに読み込もうとしています。

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

私が得る出力は:

['0,0,200,0,53,1,0,255,...,0.']
1

どうやらそれは、ファイル全体を個別のアイテムのリストではなく、1つのアイテムのリストに読み込んでいるようです。何が悪いのですか?


1
ちょうどメモとして。この質問は、csvファイルをPythonのリストに読み込む方法と言い換える必要があるようです。しかし、私は4年以上前に私が知らないOPの当初の意図に固執します。
デモンゴレム2017年



1
実際、上の答えを見ると、これはstackoverflow.com/questions/3277503/…の複製です。
AMC

回答:


135

文字列を値のリストに分割する必要があります split()

そう、

lines = text_file.read().split(',')

1
私はあなたが複数行考えると、この答えは...良化することができることを考える.csv(OPで述べたように)ファイルを、例えば、行によってアルファベット3を含むファイル(a,b,cd,e,fなど)と何を得る上記の手順を適用しますこのようなリストです['a', 'b', 'c\nd', 'e', ... ](アイテムに注意してください'c\nd')。追加したいのは、上記の問題があるにもかかわらず、この手順では、単一のメガリストの個々の行のデータを折りたたむため、通常、レコード指向のデータファイルを処理するときに必要なものではないためです。
gboffi 2017年

splitは改行を残します。この、使用しないでくださいcsvモジュールまたは他の既存のパーサ
ジャン=フランソワ・ファーブル

42

次のようにnumpy loadtxtを使用することもできます

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)

1
これも必要です。Raspberry Piで、numpyの動作が非常に遅いことに気付きました。このアプリケーションでは、ファイルを開いて1行ずつ読み取るように戻しました。
Guus

2
これは、dtype : data-typeパラメーターを介してフォーマットを指定する場合にも役立ちます。 docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html Pandas read_csvは非常に使いやすいです。しかし、フォーマットを指定する方法がわかりませんでした。それは私のファイルから浮動小数点数を読み込んでいましたが、文字列が必要でした。loadtxtを表示してくれて@Thiruに感謝します。
Ozgur Ozturk 2017

1
txtファイルに文字列が含まれている場合は、dtypeを指定する必要があります。つまり、lines = loadtxt( "filename.dat"、dtype = str、comments = "#"、delimiter = "、"、unpack = False)
Alex M981のようになります。

19

それで、リストのリストを作成したい...空のリストから始める必要があります

list_of_lists = []

次に、ファイルの内容を1行ずつ読み取ります

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

一般的な使用例は列データの場合ですが、ストレージの単位はファイルの行であり、1つずつ読み取ったため 、リストのリストを転置したい場合があります。これは、次のイディオムで実行できます

by_cols = zip(*list_of_lists)

別の一般的な用途は、各列に名前を付けることです

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

同種のデータ項目を操作できるようにする

 mean_apple_prices = [money/fruits for money, fruits in
                     zip(by_names['apples revenue'], by_names['apples_sold'])]

私が書いたもののほとんどはcsv、標準ライブラリのモジュールを使用して高速化できます。もう1つのサードパーティモジュールはですpandas。これにより、一般的なデータ分析のほとんどの側面を自動化できます(ただし、多数の依存関係があります)。


更新 Python 2 zip(*list_of_lists)ではリストの別の(転置された)リストが返されますが、Python 3では状況が変更され、添え字付きでないzipオブジェクトzip(*list_of_lists)返されます。

インデックス付きアクセスが必要な場合は、使用できます

by_cols = list(zip(*list_of_lists))

Pythonの両方のバージョンのリストのリストが表示されます。

一方、インデックス付きアクセスが不要で、列名でインデックス付けされたディクショナリを作成するだけの場合は、zipオブジェクトで十分です...

file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column

OPは、「リストのリスト」ではなく、CSVからのデータのリストが必要だと述べました。ただcsvモジュールを使用してください...
Blairg23 2018年

4

この質問は、コンマ区切り値の内容をファイルから反復可能なリストに読み取る方法を尋ねています。

0,0,200,0,53,1,0,255,...,0.

これを行う最も簡単な方法は、csv次のようなモジュールを使用することです。

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

これで、次のspamreaderように簡単に反復できます。

for row in spamreader:
    print(', '.join(row))

その他の例については、ドキュメントを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.