这依赖于您的列表元素所引用的'
字符。利用这个信息,它只在没有跟随或前置该字符的逗号处进行分割,使用正则表达式:
import re
import pandas as pd
import io
text = """TRUE, 93877, S26476961
TRUE, 93878, ['S26489167', 'S26492524']
FALSE, 93879, S26476962
FALSE, 93880, ['S26489168', 'S26492527', 'S26492528']"""
with io.StringIO(text) as f:
for line in f:
print(re.split("(?<!'), (?!')", line.strip()))
with io.StringIO(text) as f:
print(pd.read_csv(f,
header=None,
sep="(?<!'), (?!')",
engine='python'))
编辑:
如果你正在使用Python 2,你需要将文本转换为Unicode格式(在文本前加上字符u
)才能使用io.StringIO
:
import re
import pandas as pd
import io
text = u"""TRUE, 93877, S26476961
TRUE, 93878, ['S26489167', 'S26492524']
FALSE, 93879, S26476962
FALSE, 93880, ['S26489168', 'S26492527', 'S26492528']"""
with io.StringIO(text) as f:
for line in f:
print(re.split("(?<!'), (?!')", line.strip()))
with io.StringIO(text) as f:
print(pd.read_csv(f,
header=None,
sep="(?<!'), (?!')",
engine='python'))
编辑2:
如果您不希望依赖引号字符'
的存在,可以尝试以下方法:
import ast
import re
with io.StringIO(text) as f:
for line in f:
parts = re.split(", (?=\[)", line.strip())
line = []
for part in parts:
if all(char in part for char in ('[]')):
line.append(ast.literal_eval(part))
else:
line += part.split(", ")
print(line)
您将在左方括号之前的逗号上进行分割,然后按以下方式检查结果:
- 检查从分割操作生成的列表的每个元素是否具有方括号。如果是,则使用
ast.literal_eval
将其转换为 list
对象,并将其添加到最终输出列表中。
- 否则,在逗号上分割并将随后的列表添加到最终输出列表中。
这应该得到与上面的解决方案相同的结果。
我希望这可以帮助您。
[re.split("(?<!'), (?!')", line) for line in open(filename)]
。 - Abdou