【问题标题】:csv.writer writing all contents to one cellcsv.writer 将所有内容写入一个单元格
【发布时间】:2016-07-30 22:10:12
【问题描述】:

编辑:感谢@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)

而且它也不起作用。我的另一个问题是每一行都被一个额外的空行分隔,我不知道如何摆脱它。我知道有类似的问题,但没有适合我的解决方案。

【问题讨论】:

    标签: python excel csv python-3.x


    【解决方案1】:

    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)
    

    【讨论】:

    • 对我不起作用。我正在使用 excel 2010。这可能是个问题吗?
    • 您的操作系统的区域设置可能是个问题。如果默认分隔符不是逗号,Excel 会将它们全部显示在同一个单元格中。
    • 我想您使用 Excel 2010 可能是原因(但对此表示怀疑)。根据documentation(参见Dialect.delimiter),csv 文件的默认分隔符始终是逗号,并且不受操作系统区域设置的影响。
    • @ayhan:一定是这样。我刚刚将 Windows 区域和语言控制面板中的格式和位置设置分别更改为“波兰语(波兰)”和“波兰”,然后出现 OP 的问题(在 Excel 2013 中)。
    • @ayhan 你是男人(或女人)。事实就是这样。当我用分号分隔它们时按预期工作。
    【解决方案2】:

    您需要指定换行符以防止在每次迭代中添加额外的行。将变量命名为 list 也是一个坏主意,因为它是内置类型。

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

    【讨论】:

    • 好建议,但 OP 说他们已经尝试过 for i in list:, writer.writerow(i)
    • OP 说他们已经尝试过了,但是每一行都被一个空白行隔开。这就是为什么它不起作用。由于未设置newline参数而添加了新行
    • @Bolesław:我认为您应该在问题中添加几行,显示名为 list 的变量的部分或全部实际内容。
    • FWIW,此答案中的代码适用于我的示例数据。
    • 使用示例数据运行此代码后输出 .csv 文件的内容:edytor poranka PN,1/04/2016,15:00edytor PN 2,2/04/2016,08:30edytor PN noc,3/04/2016,22:00
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2015-03-12
    • 2013-02-14
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多