2016-11-21 182 views
0

我正在寫一個腳本來寫一個列表與分隔如下CSV文件到一個csv文件。但是我沒有得到適當的輸出。Python csv寫一個列表到文件

out_l = ['host\tuptime\tnfsserver\tnfs status\n', 'node1\t2\tnfs_host\tok\n', 'node2\t100\tnfs_host\tna\n', 'node3\t59\tnfs_host\tok\n'] 

代碼:

out_f = open('test.csv', 'w') 
w = csv.writer(out_f) 

for l in out_l: 
    w.writerow(l) 
out_f.close() 

輸出csv文件讀取如下。

h,o,s,t, ,s,s,h, , , , , ,s,u,d,o,_,h,o,s,t, , , , , , , ,n,f,s," 
"1,9,2,.,1,6,8,.,1,2,2,.,2,0,1, ,o,k, ,n,f,s,h,o,s,t, ,o,k," 
"1,9,2,.,1,6,8,.,1,2,2,.,2,0,2, ,f,a,i,l,e,d, ,n,a, ,n,a," 
"1,9,2,.,1,6,8,.,1,2,2,.,2,0,3, ,o,k, ,n,f,s,h,o,s,t, ,s,h,o,w,m,o,u,n,t, ,f,a,i,l,e,d," 

而且我已經檢查了csv.writer選擇喜歡的分隔符,方言= Excel中,但沒有運氣。 能有人幫助格式化輸出?

回答

0

與您out_l有格式,你可以把它寫入一個文件:

out_l = ['host\tuptime\tnfsserver\tnfs status\n', 'node1\t2\tnfs_host\tok\n', 'node2\t100\tnfs_host\tna\n', 'node3\t59\tnfs_host\tok\n'] 

with open('test.csv', 'w') as out_f: 
    for l in out_l: 
     out_f.write(l) 

要正確使用csv列,out_l應該只列出並讓csv模塊做格式化標籤和換行符:

import csv 

out_l = [['host','uptime','nfsserver','nfs status'], 
     ['node1','2','nfs_host','ok'], 
     ['node2','100','nfs_host','na'], 
     ['node3','59','nfs_host','ok']] 

#with open('test.csv', 'wb') as out_f:   # Python 2 
with open('test.csv', 'w', newline='') as out_f: # Python 3 
    w = csv.writer(out_f, delimiter='\t')  # override for tab delimiter 
    w.writerows(out_l)       # writerows (plural) doesn't need for loop 

請注意,with會自動關閉文件。

請參閱csv documentation以正確打開文件以便與csv.readercsv.writer一起使用。

0

csv.Writer.writerow方法採用可迭代和的值寫入所述可迭代產生到由指定的分隔符分離的CSV的字段:

out_f = open('test.csv', 'w') 
w = csv.writer(out_f, delimiter='\t') # set tab as delimiter 

for l in out_l: # l is string (iterable of chars!) 
    w.writerow(l.split('\t')) # split to get the correct tokens 
out_f.close() 

作爲串你的列表中已經包含必要的選項卡,你可以直接將它們寫入文件,不需要csv工具。如果您手動創建/連接了out_l中的字符串,則可以省略該步驟,並將原始數據結構傳遞給writerow

+0

如果逗號是必須的,你可以搜索並用列表中的逗號替換選項卡,然後使用shwobaseggl的方法,將逗號設置爲分隔符。 –

+0

它工作。感謝您的幫助。 – Jijo

0

delimiter參數

delimiter的參數控制在輸出的分隔符。它與輸入out_l無關。

爲什麼你的輸出是亂碼

csv.writer.writerow迭代的輸入。在你的情況下,你給它一個字符串(host\tuptime\tnfsserver\tnfs status\n'等),因此函數迭代字符串,給你一個字符序列。

如何產生正確的輸出

使用str.split()給它的字段,而不是完整的字符串列表。在你的情況下,字符串與\n結束,所以使用str.strip()還有:

import csv 

out_l = ['host\tuptime\tnfsserver\tnfs status\n', 
     'node1\t2\tnfs_host\tok\n', 
     'node2\t100\tnfs_host\tna\n', 
     'node3\t59\tnfs_host\tok\n'] 
out_f = open('test.csv', 'w') 
w = csv.writer(out_f) 
for l in out_l: 
    w.writerow(l.strip().split('\t')) 
out_f.close() 

這應該是你想要什麼:

host,uptime,nfsserver,nfs status 
node1,2,nfs_host,ok 
node2,100,nfs_host,na 
node3,59,nfs_host,ok 

參考:https://docs.python.org/3/library/csv.html