我需要用逗号解析文本文件,但不需要用引号引起来。
这看起来像是一个微不足道的任务,但无法让 Python 正确完成它。主要是因为带引号的字符串前面有一个不带引号的字符串,这使得它可能不是格式良好的 CSV,但我正是需要这种方式。
输入示例:
cmd,print "AA"
cmd, print "AA,BB,CC"
cmd, print " AA, BB, CC ", separate-window
期望的结果(Python语法):
[['cmd', 'print "AA"'],
['cmd', 'print "AA,BB,CC"'],
['cmd', 'print " AA, BB, CC "', 'separate-window']]
剥离周围的空间是可选的,一旦我得到正确的列表,我就可以
strip()
每个项目,这不是问题。
csv.reader
也用引号逗号分隔,所以我宁愿得到 ['cmd', 'print "AA', 'BB', 'CC"']
。
shlex
与更改的 .whitespace=','
和 .whitespace_split=True
几乎可以达到目的,但删除引号 ['cmd', 'print AA, BB, CC']
。我需要保留报价。
想过
re.split
,但我对(?=)
的东西如何运作知之甚少......
在这里发现了一些类似的主题,但建议的答案都不适合我。
您可能需要自己处理这些数据。我能够通过以下函数产生您想要的结果:
def parse_line(line: str) -> list[str]:
in_quote = False
start = 0
output = []
stripped_line = line.strip()
for index, char in enumerate(stripped_line):
if char == '"':
in_quote = not in_quote
if char == ',' and not in_quote:
output.append(stripped_line[start:index])
start = index + 1
else:
if index + 1 != start:
output.append(stripped_line[start:len(stripped_line)])
return output
for line in csvfile:
print(parse_line(line))
['cmd', 'print "AA"']
['cmd', ' print "AA,BB,CC"']
['cmd', ' print " AA, BB, CC "', ' separate-window']