将带引号的元组转换为像字符串一样的 csv

Convert tuple with quotes to csv like string

提问人:aeiou 提问时间:2/5/2023 更新时间:2/6/2023 访问量:68

问:

如何转换元组

text = ('John', '"n"', '"ABC 123\nDEF, 456GH\nijKl"\r\n', '"Johny\nIs\nHere"')

转换为 csv 格式

out = '"John", """n""", """ABC 123\\nDEF, 456\\nijKL\\r\\n""", """Johny\\nIs\\nHere"""'

甚至在末尾省略特殊字符

out = '"John", """n""", """ABC 123\\nDEF, 456\\nijKL""", """Johny\\nIs\\nHere"""'

我想出了这个怪物

out1 = ','.join(f'""{t}""' if t.startswith('"') and t.endswith('"')
                           else f'"{t}"' for t in text)
out2 = out1.replace('\n', '\\n').replace('\r', '\\r')
python csv export-to-csv 报价

评论


答:

1赞 Zach Young 2/5/2023 #1

您可以使用标准库中的 csv 和 io 模块非常接近您想要的内容:

  • 使用 CSV 正确编码分隔符并处理报价规则;它只写入文件句柄
  • 使用 IO。该文件句柄的 StringIO,用于以字符串形式获取生成的 CSV
import csv
import io

f = io.StringIO()

text = ("John", '"n"', '"ABC 123\nDEF, 456GH\nijKl"\r\n', '"Johny\nIs\nHere"')

writer = csv.writer(f)
writer.writerow(text)

csv_str = f.getvalue()
csv_repr = repr(csv_str)

print("CSV_STR")
print("=======")
print(csv_str)

print("CSV_REPR")
print("========")
print(csv_repr)

并打印:

CSV_STR
=======
John,"""n""","""ABC 123
DEF, 456GH
ijKl""
","""Johny
Is
Here"""

CSV_REPR
========
'John,"""n""","""ABC 123\nDEF, 456GH\nijKl""\r\n","""Johny\nIs\nHere"""\r\n'
  • csv_str如果您直接写入打开要写入的文件,则会在文件中看到的内容,这是真正的 CSV

  • csv_repr有点像你向我们展示时所要求的,但不完全是。您的示例包括“双重转义”换行符和回车符。CSV 不再需要转义这些字符,因为整个字段都带有引号。如果你需要它,你需要自己做一些事情,比如:out\\n\\r\\n

    csv_repr.replace(r"\r", r"\\r").replace(r"\n", r"\\n")
    

    但同样,这对于有效的 CSV 不是必需的。

    另外,我不知道如何让作者在第一个字段之后的每个字段之前包含一个初始空格,例如您在“John”和“n”之间以及“n”之后显示的空格

    out = 'John, """n""", ...'
    

    可以使用 Dialect.skipinitialspace 将读取器配置为预期和忽略初始空格,但我没有看到编写器的任何选项。