如何使用Python中的CSV解析器解析字符串?

时间:2015-03-21 03:17:33

标签: python

我需要使用CSV解析器解析字符串。我在很多地方找到了这个解决方案,但它对我不起作用。我使用的是Python 3.4,现在我把它改为2.7.9但仍然没有......

import csv
import StringIO

csv_file = StringIO.StringIO(line)
csv_reader = csv.reader(csv_file)
for data in csv_reader:
      # do something

有人可以建议我使用CSV解析器解析此字符串的另一种方法吗?或者我怎样才能做到这一点?

Obs:我有一个CSV格式的字符串,里面有逗号的字段,这就是我无法以标准方式解析它的原因。

2 个答案:

答案 0 :(得分:3)

您需要在包含逗号的元素周围添加双引号。

CSV格式实现RFC 4180,其中声明:

  
      
  1. 包含换行符(CRLF),双引号和逗号的字段      应该用双引号括起来。
  2.   

例如(运行代码here。):

import StringIO
import csv

# the text between double quotes will be treated 
# as a single element and not parsed by commas
line = '1,2,3,"1,2,3",4'

csv_file = StringIO.StringIO(line)
csv_reader = csv.reader(csv_file)
for data in csv_reader:
    # output: ['1', '2', '3', '1,2,3', '4']
    print data

作为另一种选择,您可以更改分隔符。 csv.reader的默认设置为delimiter=','quotechar='"',但这些都可以根据您的需要进行更改。

分号分隔符:

line = '1;2;3;1,2,3;4'

csv_file = StringIO.StringIO(line)
csv_reader = csv.reader(csv_file, delimiter=';')
for data in csv_reader:
    # output: ['1', '2', '3', '1,2,3', '4']
    print data

Vertical Bar Quotechar

line = '1,2,3,|1,2,3|,4'

csv_file = StringIO.StringIO(line)
csv_reader = csv.reader(csv_file, quotechar='|')
for data in csv_reader:
    # output: ['1', '2', '3', '1,2,3', '4']
    print data

此外,python csv模块适用于python 2.6 - 3.x,因此不应该成为问题。

答案 1 :(得分:0)

跳出页面而不是重新实现CSV解析的显而易见的解决方案是首先预处理数据并用一些从未使用过的令牌字符(甚至单词COMMA)替换字符串中的所有逗号,然后将其输入进入CSV解析器,然后返回数据并用逗号替换标记。

抱歉,我自己在Python中没有尝试过这个,但是我的数据用另一种语言引用了问题,这就是我解决它的方法。

此外,Bcorso的答案要完整得多。我只是快速破解常见的限制。