【问题标题】:Python csv write a list to filePython csv将列表写入文件
【发布时间】:2016-11-21 04:54:05
【问题描述】:

我正在编写一个脚本来将一个带有标签分隔的列表写入 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,但没有运气。 有人可以帮助格式化输出吗?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    使用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.reader 或csv.writer 使用的正确方法。

    【讨论】:

      【解决方案2】:

      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 的方法,将逗号设置为分隔符。
      • 成功了。感谢您的帮助。
      【解决方案3】:

      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

      【讨论】:

        【解决方案4】:

        很简单:

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

        【讨论】:

          猜你喜欢
          • 2012-12-11
          • 1970-01-01
          • 2014-06-27
          • 2016-09-02
          • 2016-03-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多