web-dev-qa-db-ja.com

Pythonを使ってテキストファイルをリストや配列に読み込む方法

私は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つの項目のリストに読み込んでいるようです。何がおかしいのですか?

106
user2037744

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

そう、

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

pythonのfile.readLines()メソッドはファイル内の行のリストを返します。

f = open('file_name.ext', 'r')
x = f.readlines()
f.close()

これで、行xの配列を反復処理できるはずです。

ファイルを使用したいが、後でそれを閉じることを忘れないでください。

with open('file_name.ext', 'r') as f:
    x = f.readlines()
97
user3752281

あなたもnumpy loadtxtのように使うことができます

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

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

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行ずつ読み取るので、リストのリストをtransposeにすることをお勧めします。これは次の慣用句で行うことができます。

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 2ではZip(*list_of_lists)は異なる(転置された)リストのリストを返しますが、Python 3では状況が変わり、Zip(*list_of_lists)Zipオブジェクトを返します。これは添え字なしです。

あなたが必要インデックス付きアクセスならあなたは使うことができます

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
14
gboffi

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

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))

その他の例については documentation を参照。

3
Blairg23
with open('D:\python\positive.txt', 'r') as myfile: data=myfile.read().replace('\n', '')
0
Eshan Chattaraj

ファイルに数値が含まれている場合、numpyのloadtxtメソッドが最適なアプローチのようです。次のように配列を読み取ることができます。

import numpy as np

filename = '../data/NLPR_MCT/db3/cam1.dat'
x = np.loadtxt(filename, delimiter=',')
print (x)

Xの配列として値にインデックスを付けることができ、file.readlines()はすべての行に '\ n'を挿入し、インデックス作成がエラーになる可能性があるため、不便です。

0