gpt4 book ai didi

python - 使用 csv 阅读器在文本文件中保留双引号

转载 作者:太空宇宙 更新时间:2023-11-03 11:24:36 25 4
gpt4 key购买 nike

您好,我有一个包含字符串的文本文件:

你好,"foo,酒吧"

我想把它分成一个列表:

['你好', '"foo, bar"']

有什么办法可以实现吗?

我现在正在尝试这个:

sys.stdin 中的行:
csv_file = StringIO.StringIO(行)
csv_reader = csv.reader(csv_file)

我希望它们分成两个字符串,即:

'你好' 和 '"foo, bar"'

最佳答案

假设您从 CSV 中读取一行:

from StringIO import StringIO
import csv

infile = StringIO('hello,"foo, bar"')
reader = csv.reader(infile)
row = reader.next() # row is ['hello', 'foo, bar']

行中的第二个值为 foo, bar而不是 "foo, bar" .这不是 Python 的一些怪癖,而是对 CSV 语法的合理解释。引号可能不是为了成为值的一部分,而是为了表明 foo, bar。是一个值,不应拆分为 foobar基于逗号 ( , )。另一种解决方案是在创建 CSV 文件时转义逗号,因此该行看起来像:

hello,foo \,bar

所以想要保留这些引语是一个很奇怪的请求。如果我们更多地了解您的用例和更大的图景,我们可以更好地帮助您。你想达到什么目的?输入文件从哪里来?它真的是 CSV 还是其他一些看起来相似的语法?例如,如果您知道每一行都包含两个用逗号分隔的值,并且第一个值从不包含逗号,那么您可以只在第一个逗号处拆分:

print 'hello,"foo, bar"'.split(',', 1)  # => ['hello', '"foo, bar"']

但我怀疑输入有这样的限制,这就是为什么需要像引号这样的东西来解决歧义。

如果您尝试再次写入 CSV,那么在您这样做时将重新创建引号。它们不必出现在中间列表中:

outfile = StringIO()
writer = csv.writer(outfile)
writer.writerow(row)
print outfile.getvalue()

这将打印

hello,"foo, bar"

您可以通过设置新方言来自定义准确的 CSV 输出。

如果您想获取行中应用了适当引用规则的各个值,这是可能的,但这有点 hack:

# We're going to write individual strings, so we don't want a line terminator
csv.register_dialect('no_line_terminator', lineterminator='')

def maybe_quote_string(s):
out = StringIO()

# writerow iterates over its argument, so don't give it a plain string
# or it'll break it up into characters
csv.writer(out, 'no_line_terminator').writerow([s])

return out.getvalue()

print maybe_quote_string('foo, bar')
print map(maybe_quote_string, row)

输出是:

"foo, bar"
['hello', '"foo, bar"']

这是我能回答您问题的最接近结果。它并不是真正地保留双引号,而是删除它们并使用可能与最初将它们放在那里的相同规则将它们添加回去。

我再说一遍,这个问题你可能走错了路。其他人可能会同意。这就是为什么你很难得到好的答案。您要解决的更大问题是什么?我们可以帮助您更好地实现这一目标。

关于python - 使用 csv 阅读器在文本文件中保留双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36628847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com