【问题标题】:Writing to a CSV without getting quote marks, escapcehar error在没有引号的情况下写入 CSV,escapcehar 错误
【发布时间】:2017-05-20 16:17:38
【问题描述】:

我有一个正在写入 CSV 的输出。我需要添加csv.QUOTE_NONE,但我似乎找不到正确的位置而不产生错误。

变量:

variable = ['20', '10', '30,30']

注意:我使用的一些变量将包含字符串,即 ['Test','Output', '100']

代码:

with open('file.csv', 'w') as csv_file:
    writerc = csv.writer(csv_file)
    for item in variable():
        writerc.writerow(item)

使用上述代码时,它会在 CSV 中生成以下行。

20,10,"30,30"

所需的写入是:

20,30,30,30

如果我使用quoting=csv.QUOTE_NONE,我会收到一个escapechar 错误_csv.Error: need to escape, but no escapechar set - 如果我设置了一个escapechar,这个问题就会得到解决,但是这会添加一个字符来代替引号。

有什么想法吗?

【问题讨论】:

  • 感谢您回复@PaulRooney 这很容易,但我知道有些值是字符串。上面的变量是一个示例,但我需要使用的一些变量将具有 ['Test', '20', 'Output']
  • 那么你知道哪些列应该是数字,哪些是字符串?
  • 在这种情况下必须有引号,因为您的数据是:201030,30,而不是 20103030
  • 你在创建作者时传递它writerc = csv.writer(csv_file, quoting=csv.QUOTE_NONE)here
  • writerc = csv.writer(csv_file, quoting=csv.QUOTE_NONE, escapechar='', quotechar='')here。另见docs

标签: python python-3.x csv


【解决方案1】:

您可以在写入数据之前尝试进一步拆分数据。这将避免它需要自动使用引号字符。

它通过创建一个可能包含多个新拆分条目的新值列表来工作,例如,您的 '30,30' 将变为 ['30', '30']。接下来,它使用 Python 的 chain 函数将这些子列表展平为单个列表,然后可以将其写入您的输出 CSV 文件。

import itertools
import csv

data = [['20', '10', '30,30'], ['Test','Output', '100']]

with open('file.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output)

    for line in data:
        csv_output.writerow(list(itertools.chain.from_iterable(v.split(',') for v in line)))

这将为您提供以下file.csv

20,10,30,30
Test,Output,100

【讨论】:

    【解决方案2】:
    • 我认为问题在于 .csv 表示逗号分隔 值,因此它将值中的“,”视为separatordelimiter。这就是自动使用双引号来转义的原因。
    • 我建议您使用 pandas 库,它可以更轻松地处理此问题。

    代码

    import pandas as pd
    
    df = pd.DataFrame({'variable' : ['20', '10', '30,30']})
    # Note that I use '\t' as the separator instead of ',' and get a .tsv file which
    # is essentially the same as .csv file except the separator.
    df.to_csv(sep = '\t', path_or_buf='file.tsv', index=False)
    

    您可以在Full script 中看到使用这两个分隔符的区别。另一件事是,我认为您的代码建议您使用 variable 作为column 的名称,但您的输出建议您使用variable 作为row 的名称(或index)。无论如何,我的回答是基于您使用variable 的假设 作为column 的名称。希望对您有所帮助;)

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2021-10-30
      • 1970-01-01
      • 2016-05-14
      • 2023-04-04
      • 2022-01-24
      • 1970-01-01
      • 2016-11-30
      • 2023-02-03
      相关资源
      最近更新 更多