Slayer 的代码在美国为我工作,但如果我将 Windows 区域和语言设置更改为波兰,它就不行了,我终于能够重现你的问题。
根据@ayhan,这是因为 Excel 中的一个错误,它期望 ; 在区域设置中读取和保存 csv 文件时作为分隔符,其中 , 用作小数分隔符(十进制标记),例如位于波兰(以及世界其他大部分地区)。
可能最简单的解决方法是在您创建 csv.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 格式和位置设置为“波兰”,我会看到以下内容(现在是正确的):
更新
动态执行此操作的一种方法是让脚本根据当前语言环境设置确定要使用的分隔符,并在存在冲突时选择不同的分隔符 - 尽管硬编码 ; 应该适用于任何不使用它的地方作为小数点(我不知道有一个)。
既然我们现在知道是什么导致了这个问题,我也会取出 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)