python解析逗号分割的引号中的字符串

需求: 供应商提供了如下数据txt文件,现在想通过python解析这些数据,共10列

"CN","823923424","SET","KG","01/01/2011","优美的小调(钢琴曲)","塑料,制品",,"","个人梳妆旅行用具"

难点

1. 数据逗号分隔,但是数据中可能也包含逗号,如:"塑料,制品"

2. 数据多是通过双引号包裹,但是有些空值数据没有通过双引号包裹

尝试过的错误方法

1. 通过replace,split函数

data = '"CN","823923424","SET","KG","01/01/2011","优美的小调(钢琴曲)","塑料,制品",,"","个人梳妆旅行用具"'
line_data = data.replace('"', '').split(',')
  print(line_data)
运行结果:
['CN', '823923424', 'SET', 'KG', '01/01/2011', '优美的小调(钢琴曲)', '塑料', '制品', '', '', '个人梳妆旅行用具']

结果数据中的逗号也被解析了,结果多了一列,错误!

2. 通过shlex解析

import shlex
data = '"CN","823923424","SET","KG","01/01/2011","优美的小调(钢琴曲)","塑料,制品",,"","个人梳妆旅行用具"'
str = shlex.shlex(data, posix=True)
str.whitespace=','
b=list(str)
print(b)
运行结果:
['CN', '823923424', 'SET', 'KG', '01/01/2011', '优美的小调(钢琴曲)', '塑料,制品', '', '个人梳妆旅行用具']

解析结果只有9列,错误!

最终解决方案

1. 使用pyparsing解析

import pyparsing as pp
data = '"CN","823923424","SET","KG","01/01/2011","优美的小调(钢琴曲)","塑料,制品",,"","个人梳妆旅行用具"'
print(pp.commaSeparatedList.parseString(data))
csv_line = pp.commaSeparatedList.copy().addParseAction(pp.tokenMap(lambda s: s.strip('"')))
print(csv_line.parseString(data).asList())
运行结果:
['"CN"', '"823923424"', '"SET"', '"KG"', '"01/01/2011"', '"优美的小调(钢琴曲)"', '"塑料,制品"', '', '""', '"个人梳妆旅行用具"']
['CN', '823923424', 'SET', 'KG', '01/01/2011', '优美的小调(钢琴曲)', '塑料,制品', '', '', '个人梳妆旅行用具']

2. 使用csv库

import csv
data = '"CN","823923424","SET","KG","01/01/2011","优美的小调(钢琴曲)","塑料,制品",,"","个人梳妆旅行用具"'
print(next(csv.reader(data.splitlines(), skipinitialspace=True)))
运行结果:
['CN', '823923424', 'SET', 'KG', '01/01/2011', '优美的小调(钢琴曲)', '塑料,制品', '', '', '个人梳妆旅行用具']

结果2效率高于1

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值