Python csv写一个列表到文件

问题描述:

我正在写一个脚本来写一个列表与分隔如下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中,但没有运气。 能有人帮助格式化输出?

与您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一起使用。

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

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