【问题标题】:Enclosing every CSV field that having commas in between with double quotes in python在python中用双引号将每个逗号分隔的CSV字段括起来
【发布时间】:2022-01-26 10:41:01
【问题描述】:

我正在尝试使用 csv 模块将每个字段值括在双引号中。 但这里的诀窍是我们在需要跳过的值之间有逗号。 这是我用来将值括在引号中的 sn-p。

数据:

col1,col2
first row,This section of the badge focuses on Communications
second row,Feedback has partnered with team members, leaders, and executives receive confidential, anonymous feedback

代码sn-p

import csv

with open('data.csv') as input, open('out.csv','w') as output:
    reader = csv.reader(input)
    writer = csv.writer(output, delimiter=',', quoting=csv.QUOTE_ALL)
    for line in reader:
        writer.writerow(line)

输出

"col1","col2"
"first row","This section of the badge focuses on Communications"
"second row","Feedback has partnered with team members"," leaders"," and executives receive confidential"," anonymous feedback"

预期输出

"col1","col2"
"first row","This section of the badge focuses on Communications"
"second row","Feedback has partnered with team members, leaders, and executives receive confidential, anonymous feedback"

【问题讨论】:

  • 为什么不使用“\”,作为分隔符?
  • 您的真实 csv 文件中有多少列?
  • @Tbaki 这就是我们的客户 API 的创建方式,他们使用分隔符作为逗号
  • @Corralien 实际上是 2
  • @jennie 如果您的数据集中有“,”和数据中的“,”,使用它作为分隔符不是一个好习惯,请尝试让他们将其更改为不如果您可以联系到他们,请显示在数据集中;

标签: python pandas csv


【解决方案1】:

由于输入数据不是常规的 CSV 文件,使用csv 模块读取输入文件可能会出现问题。 要解决这个问题,你可以直接读取文件的行,然后解析如下:

import csv

with open('data.csv') as fin, open('out.csv','w') as fout:
    writer = csv.writer(fout, delimiter=',', quoting=csv.QUOTE_ALL)
    for line in fin:
        writer.writerow(line.rstrip().split(',', 1))

【讨论】:

  • 当我对完整文件执行相同的 sn-p 时,我面临以下错误。 UnicodeEncodeError:“charmap”编解码器无法在位置 168 编码字符“\u200b”:字符映射到
【解决方案2】:

您可以将DictReaderDictWriterrestkey 属性一起使用:

with open('data.csv') as inp, open('out.csv', 'w') as out:
    reader = csv.DictReader(inp, restkey='colN')
    writer = csv.DictWriter(out, fieldnames=reader.fieldnames,
                            delimiter=',', quoting=csv.QUOTE_ALL)
    writer.writeheader()
    for line in reader:
        line[reader.fieldnames[-1]] += ','.join(line.pop('colN', []))
        writer.writerow(line)

out.csv的内容:

"col1","col2"
"first row","This section of the badge focuses on Communications"
"second row","Feedback has partnered with team members leaders, and executives receive confidential, anonymous feedback"

【讨论】:

  • 当我对完整文件执行相同的 sn-p 时,我面临以下错误。 UnicodeEncodeError:“charmap”编解码器无法在位置 168 编码字符“\u200b”:字符映射到
  • 尝试使用encoding='latin1'(或'utf-8')作为两个open文件的参数
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多