【问题标题】:Export to CSV separating all chars into fields导出为 CSV,将所有字符分隔为字段
【发布时间】:2016-06-07 01:43:51
【问题描述】:

我正在编写一个 python 脚本来审核来自我公司的许多不同应用程序的所有 CSV 文件,我遇到了一点麻烦,我几乎完成了一个概念证明,并提交给老板,并且炫耀我可以用 python 做什么,但问题是我不太了解 python 中的 CSV 类....

这是我的计算机信息列表的示例:

['EB-ABORTZ,True,False,False,0', 'EB-AGONCHAROVA,True,False,False,0',
 'EB-AHART-1,True,False,False,0', 'EB-AHEIDENREICH,True,False,False,0',
 'EB-ALOCKLEAR,True,False,False,0', 'EB-AMARGULIS,True,False,False,0',
 'EB-ASKLAR,True,False,False,0', 'EB-ASKLAR-1,True,False,False,0',
 'EB-ASKLAR-3,True,False,False,0', 'EB-BCHOW-1,True,False,False,0',
 'EB-BJOHNSON,True,False,False,0', 'EB-BLYLE,True,False,False,0',
 'EB-BRUSSUM,True,False,False,0', 'EB-CCLEARY,True,False,False,0',
 'EB-...]

这是最后代码生成的示例.....

"E","B","-","A","B","O","R","T","Z",",","T","r","u","e",",","F","a","l","s","e",",","F","a","l","s","e",",","0"
"E","B","-","A","G","O","N","C","H","A","R","O","V","A",",","T","r","u","e",",","F","a","l","s","e",",","F","a","l","s","e",",","0"
"E","B","-","A","H","A","R","T","-","1",",","T","r","u","e",",","F","a","l","s","e",",","F","a","l","s","e",",","0"
"E","B","-","A","H","E","I","D","E","N","R","E","I","C","H",",","T","r","u","e",",","F","a","l","s","e",",","F","a","l","s","e",",","0"
"E","B","-","A","L","O","C","K","L","E","A","R",",","T","r","u","e",",","F","a","l","s","e",",","F","a","l","s","e",",","0"
"E","B","-","A","M","A","R","G","U","L","I","S",",","T","r","u","e",",","F","a","l","s","e",",","F","a","l","s","e",",","0"

这是我在事后尝试将数据导出为 CSV 格式的方法的副本。

def collate_computers(computers):
    with open('results.csv', 'w', encoding='utf8', )as outfile:
        writer = csv.writer(outfile, quoting=csv.QUOTE_ALL, delimiter=',')
        for c in computers:
            writer.writerow(c)

【问题讨论】:

  • 您的问题到底是什么?我可以正确使用您的代码。你的预期输出是什么?

标签: python python-3.x csv export-to-csv


【解决方案1】:

CSV 写入器函数writerow 将列表作为输入并将每个元素写入行。当您将单个字符串传递给函数时,编写器将字符串解释为字符列表。

我假设您想按字符串中出现的方式写入每一行。所以不要使用writer.writerow(c),而是使用writer.writerow(c.split(','))。这会将字符串拆分为一个列表,并用逗号分隔。

您的 csv 文件应如下所示:

EB-ABORTZ,True,False,False,0
EB-AGONCHAROVA,True,False,False,0
EB-AHART-1,True,False,False,0
EB-AHEIDENREICH,True,False,False,0
EB-ALOCKLEAR,True,False,False,0
EB-AMARGULIS,True,False,False,0
EB-ASKLAR,True,False,False,0
EB-ASKLAR-1,True,False,False,0
EB-ASKLAR-3,True,False,False,0
EB-BCHOW-1,True,False,False,0
EB-BJOHNSON,True,False,False,0
EB-BLYLE,True,False,False,0
EB-BRUSSUM,True,False,False,0
EB-CCLEARY,True,False,False,0

【讨论】:

    【解决方案2】:

    问题是computers中的每个项目都是一个字符串,而Python中的字符串是字符序列,所以writer.writerow()认为每个字符都是一个单独的字段。要解决这个问题,您需要首先将每个字符串 split 根据逗号所在的字段放入字段中:

    import csv
    
    def collate_computers(computers):
        with open('results.csv', 'w', encoding='utf8') as outfile:
            writer = csv.writer(outfile, quoting=csv.QUOTE_ALL, delimiter=',')
            for s in computers:
                fields = s.split(',')
                writer.writerow(fields)
    
    computers = [
        "EB-ABORTZ,True,False,False,0",
        "EB-AGONCHAROVA,True,False,False,0",
        "EB-AHART-1,True,False,False,0",
        "EB-AHEIDENREICH,True,False,False,0",
        "EB-ALOCKLEAR,True,False,False,0",
        "EB-AMARGULIS,True,False,False,0"
    ]
    
    collate_computers(computers)
    

    results.csv

    "EB-ABORTZ","True","False","False","0"
    "EB-AGONCHAROVA","True","False","False","0"
    "EB-AHART-1","True","False","False","0"
    "EB-AHEIDENREICH","True","False","False","0"
    "EB-ALOCKLEAR","True","False","False","0"
    "EB-AMARGULIS","True","False","False","0"
    

    【讨论】:

      【解决方案3】:

      按原样,您的 write rows 方法会生成逗号分隔值 (.csv)

      csv 模块不直接支持读写 Unicode, 但对于 ASCII NUL 的一些问题,它是 8 位干净的 人物。所以你可以编写函数或类来处理 只要您避免像这样的编码,就可以为您编码和解码 使用 NUL 的 UTF-16。推荐使用 UTF-8。 更多信息here

      如果您希望每行 1 个字符串(即每行 1 个列表项)

      with open('results.csv', 'w') as outfile:
          csvWriter = csv.writer(outfile)
          for c in computers:
              csvWriter.writerow([c.encode('utf-8')])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 2016-03-13
        相关资源
        最近更新 更多