【问题标题】:csv to tsv in python with nested quotes带有嵌套引号的python中的csv到tsv
【发布时间】:2021-09-10 10:03:53
【问题描述】:

我有一个 CSV 文件,其中包含如下行:

"AAA","BBB","Test,""Test""","CCC",DDD
"111","222,""333""","XXX","YYY, ZZZ" 

处理嵌套引号不能提供所需的结果:

AAA    BBB    "Test, ""Test"""    CCC    DDD
111    "222, ""333"""    XXX    YYY, ZZZ 

想要的结果:

AAA    BBB    Test, "Test"    CCC    DDD
111    222, "333"    XXX    YYY, ZZZ 

这是我尝试过的:

csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin, delimiter=',', quotechar='"'))
csv.writer(sys.stdout, dialect='excel-tab', delimiter='\t').writerows(csv.reader(sys.stdin, delimiter=',', quotechar='"'))

顺便说一句,性能很重要。

【问题讨论】:

  • 真正的问题似乎在于逗号周围的空格。你真的真的在每个之后都有一个空间吗? (为什么?)
  • 不,很好
  • 我相信您的“期望结果”不再是有效的 CSV。您可以使用 csv.writer(sys.stdout, dialect='excel-tab', csv.QUOTE_NONE) 请求此操作,但是当您尝试编写需要引用的行时会出现错误。
  • “不再”是什么意思? csv 格式/标准改变了吗?
  • 好像没有一个“标准”;这是微软的领地。

标签: python python-3.x csv


【解决方案1】:

理论上你可以提出这个要求

csv.writer(sys.stdout, dialect='excel-tab', csv.QUOTE_NONE)

但是如果您尝试输出 Python 认为需要引用的内容,则会出现错误:

_csv.Error: need to escape, but no escapechar set

您或许可以定义自己的csv.Dialect,但此时最简单的解决方案可能是将输出视为文本。

r = csv.reader(sys.stdin)
for row in r:
    sys.stdout.write('\t'.join(row))
    sys.stdout.write('\n')

这显然失去了您从使用经过测试和调试的csv 对象获得的一些保证,但您似乎确信自己的要求,也许这是一个可以接受的简化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 2016-07-02
    • 2017-09-28
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多