1

我正在使用 shlex 来解析 csv 文件,并且需要像这样保留连续的空白字符......

line = 'a, b, "c, z",,,d,e,f'
spltr = shlex.shlex(line)
spltr.whitespace += ','
parts = list(spltr)
print parts

['a', 'b', '"c, z"', 'd', 'e', 'f']会在我真正想要的时候返回['a', 'b', '"c, z"', '', '', 'd', 'e', 'f']。如何告诉 shlex 保留这些连续的空白字符而不是删除它们?

4

2 回答 2

1

您应该使用该csv模块:

import csv
from cStringIO import StringIO

line = 'a, b, "c, z",,,d,e,f'
parts = next(csv.reader(StringIO(line), skipinitialspace=True))

请注意,这会删除输出中的引号:

['a', 'b', 'c, z', '', '', 'd', 'e', 'f']

这与您所说的您想要的略有不同,但希望没什么大不了的(也许这样会更好?)。

现在,您还说您关心性能和多核解析。因此,我建议您进行流式读取,而不是像我在上面的示例中那样使用 StringIO 来缓冲。您可以在每个进程中将文件打开file.seek()到适当的位置,然后从那里读取,当文件位置到达特定进程的末尾时停止。

或者,如果您想在单个进程中获得高性能,请查看 NumPy,如果 CSV 文件是矩形的(每行具有相同数据类型的相同数量的列),它可以有效地读取它们。

于 2013-07-13T03:22:31.137 回答
1

这不适用于shlex,在命令行上,空白字符的数量不相关。

spltr.whitespace += ','

一个或多个空白之间没有区别,它们作为单个项目处理。

这是一个有效的解决方案:

  • 请将您的输入文件分成几行
  • 如果你愿意,将你的块发送到另一个进程
  • 使用StringIO这样你就可以在每个块上都有文件语义
  • 使用csv模块

工作示例:

>>> import csv
>>> import StringIO
>>>
>>> line = 'a, b, "c, z",,,d,e,f'
>>> file_like = StringIO.StringIO(line)
>>>
>>> csvreader = csv.reader(file_like, delimiter=',', quotechar='"', skipinitialspace=True)
>>> list(csvreader)
[['a', 'b', 'c, z', '', '', 'd', 'e', 'f']]
于 2013-07-13T03:24:52.133 回答