209

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 つのアイテムだけのリストに読み込んでいるようです。私は何を間違っていますか?

4

6 に答える 6

174

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

そう、

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

編集:これにそれほどの牽引力があるとは思いもしませんでした。これは、より慣用的なアプローチです。

import csv
with open('filename.csv', 'r') as fd:
    reader = csv.reader(fd)
    for row in reader:
        # do something
于 2013-02-03T19:29:10.763 に答える
61

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

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)
于 2013-02-04T10:46:55.860 に答える
25

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

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)

もう 1 つの一般的な用途は、各列に名前を付けることです。

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 2zip(*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
于 2014-11-20T17:47:24.583 に答える