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格式和位置设置为“波兰”,则会看到以下内容(现在正确):
更新
一种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)