2016-06-07 82 views
0

我在编写一个python脚本时遇到了一些问题,以审核我公司的许多不同应用程序中的所有CSV文件,而且我几乎用概念带给老板,并炫耀我可以用python做什么,但问题是,我不明白在python中的CSV类所有这一切以及......导出为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) 
+1

究竟是什么问题了吗?我可以正确使用你的代码。什么是您的预期输出? – MaThMaX

回答

0

的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 
+0

这工作!我希望这不是我错过的东西! –

0

原样,则产生的写入行方法逗号分隔值(.csv)

csv模块不直接支持读取和写入的Unicode, 但它是8比特请使用ASCII NUL 字符清除一些问题。因此,只要避免使用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')]) 
0

的问题是在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"