用Python将列表写入csv文件

4
我正在编写一个脚本,将如下用制表符分隔的列表写入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选项,像分隔符和dialect=excel,但是没有成功。 有人可以帮忙格式化输出吗?

4个回答

8

根据您在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)

为了正确使用csvout_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文档以了解正确打开文件供csv.readercsv.writer使用的方法。

2
< p > 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


如果必须使用逗号,您可以在列表中搜索并替换制表符为逗号,然后使用shwobaseggl的方法,将逗号设置为分隔符。 - David Peterson Harvey
它成功了。感谢您的帮助。 - 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


0
非常简单:
with open("test.csv" , 'w') as csv_file:
     writer = csv.writer(csv_file, delemeter='\t')
     for item in out_l:
          writer.writerow([item,])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接