Python CSV模块,特殊分割字符串

3

i had an unique problem. I have code:

with open("test.csv", "r") as csvFile:
reader = csv.reader(csvFile, skipinitialspace=True)
for row in reader:
    for obj in row:
        print(obj)

并且有一个示范csv文件:

anotherCommand, e=5, f=6, g=7, h=9, test="aaa, bbb, ggggg"

我想按照以下方式拆分这个字符串:
anotherCommand
e=5
f=6
g=7
h=9
test="aaa, bbb, ggggg"

但是我看到的代码将这些字符串按照以下方式拆分:
anotherCommand
e=5
f=6
g=7
h=9
test="aaa
bbb
ggggg"

这是错误的解决方案。 我看到了这样的话题: 为什么Python CSV阅读器忽略了双引号字段? 或者 如何将逗号分隔的字符串解析为列表(注意事项)? 但是这个例子不同,而且这些例子都没有达到我的期望。 有人有想法吗?

@cᴏʟᴅsᴘᴇᴇᴅ不起作用,就像链接网站上的情况一样 :) - Robert Pawlak
@JonClements 是的 - Robert Pawlak
@JonClements 的一个真实例子,我必须处理:队列,名称="EQ_L2_PS_PEER_0, ESP, ON",ID=0x1007,qgroup_addr=0x31f597c0。 - Robert Pawlak
它们都是以那种格式呈现的吗?例如:一列某些内容,然后跟随着键=值或键="值"的其他列? - Jon Clements
1
你的问题关键在于你的“csv”不是一个格式良好的CSV文件。如果你能生成一个有效的CSV文件,那么Python CSV解析将会起作用。看起来对于你的例子,你需要在test="aaa, bbb, ggggg"周围添加引号,使其看起来像"test="aaa, bbb, ggggg"",但你也可以尝试在每个值周围添加引号。 - DisappointedByUnaccountableMod
显示剩余9条评论
1个回答

1

在这里可能会用到shlex.split

import shlex

with open('test.csv') as fin:
    for line in fin:
        row = [col.rstrip(',') for col in shlex.split(line)]
        print(*row, sep='\n')

太棒了!它有效!你能给我解释一下你的解决方案吗?或者给我链接网站,让我去学习吗? - Robert Pawlak
这是一个优势,我计划在进一步的文件处理中删除它们。 - Robert Pawlak
1
@Robert 关于引用 - 请查看 shlex 模块的文档 - 它尝试像 shell 一样解析文本,当将命令行参数传递给程序时...(这是你的行看起来更像实际 CSV 数据而不是命令行参数 - 所以我想试试看它是否能为您的用例生成可用的东西,它大部分都可以,但保留尾随逗号 - 因此有 str.rsplit)... - Jon Clements
这是一个使用CSV格式设计的具有不同输出格式的输出。 - Robert Pawlak
@Robert 如果你要使用这个方法的话,也许做一个 values = dict(col.partition('=')[::2] for col in row) 可以得到一个键/值对的 dict,可以用于你想要使用它的地方。 - Jon Clements
@Robert,那么你会得到类似这样的东西:{'id': '0x1007','name': 'EQ_L2_PS_PEER_0, ESP, ON','qgroup_addr': '0x31f597c0','queue': ''} - 所以如果第一列总是带有键值的纯文本,则可以忽略它,但否则,可能需要更有用的结构... - Jon Clements

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接