Python CSV 阅读器:需要忽略引号逗号作为分隔符

问题描述 投票:0回答:1

我需要用逗号解析文本文件,但不需要用引号引起来。
这看起来像是一个微不足道的任务,但无法让 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
,但我对
(?=)
的东西如何运作知之甚少......

在这里发现了一些类似的主题,但建议的答案都不适合我。

更新:对于任何质疑我是否完全按照我所描述的方式进行操作的人的屏幕截图:

python csv regex-lookarounds
1个回答
0
投票

您可能需要自己处理这些数据。我能够通过以下函数产生您想要的结果:

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']
© www.soinside.com 2019 - 2024. All rights reserved.