2012-07-30 91 views
1

假設我希望內置的python csv編寫器忽略數組中的某些字符串值(在輸出中逗號之間沒有值)。例如,csv編寫器忽略某些值

my_list = [4, 'foo', 'close', 9, 0] 

csv output => 4, ,'close', 9, 0 

我會提供一個參數'foo',指定被作者忽略,這可能嗎?如果是這樣,有人可以幫助實施?

+1

能否請您解決您的輸出?有一個流浪的引號,我不確定是否需要'','或'',''作爲分隔符 – jamylak 2012-07-30 12:35:10

+0

固定;)(額外字符) – jab 2012-07-30 12:37:04

+0

您真的想要字符串的表示法(''close '')而不只是'close'? – jamylak 2012-07-30 12:38:00

回答

1
>>> import csv 
>>> my_list = [4, 'foo', 'close', 9, 0] 
>>> with open('test.csv', 'w') as fout: 
     w = csv.writer(fout, delimiter=',') 
     w.writerow([x if x != 'foo' else ' ' for x in my_list]) 

>>> print open('test.csv').read() 
4, ,close,9,0 
0

你可以使用像這樣做的列表中替換:

map(lambda x : str(x) if x != 'foo' else ' ', my_list) 

,只是做了join創建輸出字符串:

','.join(map(lambda x : str(x) if x != 'foo' else ' ', my_list)) 
+0

請注意,列表推導通常被認爲是比'map'更好的風格'lambda' – jamylak 2012-07-30 12:48:50

0

你可以試試這個:

ignored_strings = {'foo', 'ignored2', 'ignored3'} 

my_list_filtered = [value if value not in ignored_strings else '' for value in my_list] 

用空字符串替換要忽略的每個值。然後您可以使用csv編寫器打印出新列表。

您也可以在列表理解結束時使用'if'語句簡單地從列表中刪除不想要的值,具體取決於您希望輸出的樣子。

+2

如果你打算使用這種方法,'ignored_strings'應該是一個集合 – mgilson 2012-07-30 12:47:33

2

你可以做這樣的事情,如果你有行的2D名單寫:

lines = [[4, 'foo', 'close', 9, 0], [5, 'foo', 'close', 9, 0]] 

import csv 
with open("outfile.csv", "wb") as outf: 
    w = csv.writer(outf) 
    for line in lines: 
     w.writerow(["" if e == "foo" else e for e in line]) 
+0

請注意,這不適用於python 3.它會引發錯誤:'TypeError:'str'不支持緩衝區接口 – jamylak 2012-07-30 12:47:38