csv.writer将所有内容写入一个单元格

编辑 :解决感谢@ayhan。 如果您来自波兰,请使用分号而不是逗号作为分隔符。

我有一个列表如下所示:

list = [['edytor poranka PN', '1/04/2016', '15:00'], ['edytor PN 2', '2/04/2016', '08:30'], ['edytor PN noc', '3/04/2016', '22:00']] 

csv.writer将每个列表写入一个单元格而不是3个单独的单元格。

我的代码如下所示:

 with open('file.csv', 'w') as f: writer = csv.writer(f, delimiter=',', quoting=csv.QUOTE_MINIMAL) writer.writerows(list) 

我也试过这个方法:

 for i in list: writer.writerow(i) 

而且这也行不通。 我的另一个问题是,每行被一个额外的空行分隔,我不知道如何摆脱它。 我知道有类似的问题,但没有解决scheme为我工作。

您需要指定换行符以防止在每次迭代中添加额外的行。 同样命名你的variableslist是一个坏主意,因为它是一个内置的types。

 with open('file.csv', 'w', newline='') as f: writer = csv.writer(f) for a_list in lists: writer.writerow(a_list) 

Slayer的代码在这里工作的是美国,但是如果我将Windows区域和语言设置更改为波兰,它不会,我终于可以重现您的问题。

据@ayhan说,这是因为Excel中存在一个bug, 在读取和保存区域设置中的csv文件时,用作分隔符,用作十进制分隔符(小数点),例如在波兰(以及世界大部分地区)。

可能最简单的解决方法就是在创buildcsv.writer对象时指定Excel在您的区域中预期的分隔符,如下所示:

 #!/usr/bin/env python3 import csv list_of_lists = [['edytor poranka PN', '1/04/2016', '15:00'], ['edytor PN 2', '2/04/2016', '08:30'], ['edytor PN noc', '3/04/2016', '22:00']] with open('file.csv', 'w', newline='') as f: writer = csv.writer(f, delimiter=';') for sublist in list_of_lists: writer.writerow(sublist) 

运行脚本之后的file.csv内容:

 edytor poranka PN;1/04/2016;15:00 edytor PN 2;2/04/2016;08:30 edytor PN noc;3/04/2016;22:00 

之后,如果我在Microsoft Excel 2013中打开它,并在Windows区域和语言控制面板中将Windows格式和位置设置为“波兰”,则会看到以下内容(现在正确):

在Excel 2013中打开文件后的截图

更新

一种dynamic的做法是让脚本根据当前的语言环境设置确定使用什么分隔符,如果发生冲突则选​​择不同的分隔符 – 尽pipe硬编码; 应该工作在任何不使用它作为小数点的地方(我不知道有一个这样做)。

既然我们现在知道是什么原因造成了这个问题,我也会writerows()介绍的for循环Slayer,并返回到使用了writerows()代码版本。

 import csv import locale # Chose an Excel compatible csv delimiter. locale.setlocale(locale.LC_ALL, '') DELIMITER = ';' if locale.localeconv()['decimal_point'] == ',' else ',' list_of_lists = [['edytor poranka PN', '1/04/2016', '15:00'], ['edytor PN 2', '2/04/2016', '08:30'], ['edytor PN noc', '3/04/2016', '22:00']] with open('file.csv', 'w', newline='') as f: writer = csv.writer(f, delimiter=DELIMITER) writer.writerows(list_of_lists)