我正在使用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保留这些连续的空格字符而不是丢弃它们?
答案 0 :(得分: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文件(每行具有相同数量的具有相同数据类型的列)。
答案 1 :(得分: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']]