2

.csv のすべての行を辞書に変換しようとしています (キーは .csv の最初の行です)。次に、これらの各辞書をリストに入れようとしています。このコードを実行すると、リストに各辞書 (一時的に dataLine として保存) を正しく追加するのではなく、.csv の最後の行を何度もリストに追加することになりますか? コード内の行「dataList.append(dataLine)」を「print dataLine」に置き換えると、コードは .csv を反復処理し、最後の行を何度も印刷するのではなく、各行を個別に印刷するため、これはさらに混乱します。また。

from sys import argv
import csv

# arguments
script, csvFile = argv

# check input
while csvFile.endswith(".csv") == False:
    csvFile = raw_input("Please enter a *.csv file:  ")

# open the csv file
openFile = open(csvFile, 'r')

# read the csv file
reader = csv.reader(openFile, delimiter=',')

# extract first row to use as keys
for row in range(1):
    keys = reader.next()

# turn rows into dictionaries with keys
#FIX THIS PART!!  NOT WORKING RIGHT!!!
length = len(keys)
dataLine = {}
dataList = []
for row in reader:
    for i in range(length):
        dataLine[keys[i]] = row[i]
    dataList.append(dataLine)

for x in dataList:
    print x
    print ""

# close the file
openFile.close()
4

3 に答える 3

2

同じ辞書 ( dataLine) への参照をdataList複数回挿入します。途中で辞書の内容を変更しますが、同じオブジェクトのままです。

外側のループに移動dataline = {}します。

for row in reader:
    dataLine = {}
于 2013-01-21T17:37:07.997 に答える
2

あなたが試すことができることの1つは、組み込みのDictReaderクラスを使用することですcsv:

>>> import csv
>>> with open('fake_csv.csv', 'r') as f:
...     reader = csv.DictReader(f)
...     my_rows = [row for row in reader]
...     
>>> my_rows
[{'title1': 'something', 'title2': 'another'}, {'title1': 'cool', 'title2': 'stuff'}]

DictReader実際にあなたが説明していることを行います-最初の行を列のタイトルとして使用し、キーが列のタイトルであり、値がその行の列の値である後続の各行から辞書を作成します。使用withは、ファイルが不要になったときにファイルが適切に閉じられるようにする方法です。次の行:

my_rows = [row for row in reader]

を反復処理し、各行を結果のリストに入れるリスト内包表記です(ヘッダー行を除く)。reader

ここでは、次のような CSV を使用しました。

title1,title2
something,another
cool,stuff
于 2013-01-21T17:38:40.953 に答える
0

あなたのコードdataLineでは、特定のオブジェクトへの単なる参照です。各反復の後、このオブジェクトは変更されます。したがって、リストdataListには同じオブジェクトのシーケンスが格納されます。

代わりにこれを使用してください:

dataLine = {key:row[i] for i, key in enumerate(keys)}

この場合、繰り返しごとに新しい辞書を作成します。

于 2013-01-21T17:40:28.003 に答える