2013-12-07 15 views
1

我有一個通過csv.writer對象生成的CSV文件。下面是代碼的簡化版本生成文件:在一列中解析包含列表的CSV

output = open('out.txt', 'ab+') 
writer = csv.writer(output, dialect='excel') 

for item in dataset: 
    row = [] 
    row.append(item['id']) 
    row.append(item['timestamp']) 

    values = [] 
    for value in item['values'] 
     values.append(value['name']) 
    row.append(values) 

    writer.writerow(row) 
    output.flush() 

output.close() 

在CSV文件中的樣本行看起來是這樣的:

457458856894140182,Mon Dec 02 11:36:48 +0000 2013,[u'Sugar', u'Rice', u'Bleach'] 

我使用csv.reader對象來解析數據嘗試回到另一個腳本中,但還沒有能夠正確解析第三列中的列表。 Python僅將整個值[u'Sugar', u'Rice', u'Bleach']看作一個字符串。例如,代碼:

input = open('out.txt', 'rb') 
reader = csv.reader(input, dialect='excel') 

for row in reader: 
    print row[2][0] 

input.close() 

...只是輸出的[上換行符一個長長的清單。

如何正確解析此CSV文件,以便將第三列中的結構組裝回到內存中的列表中?

+1

你允許改變它的格式書寫的?現在你所做的事情並沒有在你的列表中引用逗號,所以最好將它們寫成一個組合的引用對象,或者給列表中的每個成員分列自己的列。 (另外:那不可能是你的代碼 - 內部for循環裏有一個冒號,請始終複製並粘貼你正在使用的代碼。) – DSM

+0

我可以改變未來的CSV格式,是的,但不幸的是我無法更改已經生成的CSV格式。不,這不是我確切的代碼,因爲我的確切代碼長達幾百行。我的目標是提供[SSCCE](http://sscce.org/)。 – Jamie

+0

SSCCE不能有語法錯誤,應該是自包含的。 :^) – DSM

回答

1

從字符串[u'Sugar', u'Rice', u'Bleach']就可以得到相應的list對象與ast.literal_eval

>>> a="[u'Sugar', u'Rice', u'Bleach']" 
>>> import ast 
>>> ast.literal_eval(a) 
[u'Sugar', u'Rice', u'Bleach'] 
>>> ast.literal_eval(a)[1] 
u'Rice' 
>>> 
+1

這正是我正在尋找的,謝謝! – Jamie