Python CSV文件中双引号中的逗号

Python CSV文件中双引号中的逗号,python,csv,Python,Csv,我有一个字符串,如示例中所示: data = '02 JAN 2014,FEB 2014,A,1.00,,,""1,235.100000"",""1,230.00"",Column' 如何使用python的csv模块解析此字符串 data = StringIO.StringIO(data) reader = csv.reader(data, quoting=csv.QUOTE_NONE) 它将字符串“1235.10000”分隔为两列:“1”和“235.1000” 如何修复此问题并使模块在双

我有一个字符串,如示例中所示:

data = '02 JAN 2014,FEB 2014,A,1.00,,,""1,235.100000"",""1,230.00"",Column'
如何使用python的
csv
模块解析此字符串

data = StringIO.StringIO(data) 
reader = csv.reader(data, quoting=csv.QUOTE_NONE)
它将字符串“1235.10000”分隔为两列:
“1”和
“235.1000”


如何修复此问题并使模块在双引号中不拆分逗号?

我不确定这是否足够好,但是:

>>> import csv
>>> data = '02 JAN 2014,FEB 2014,A,1.00,,,""1,235.100000"",""1,230.00"",Column'
>>> reader = csv.reader([data.replace('""', '|')], quotechar='|')
>>> next(reader)
['02 JAN 2014', 'FEB 2014', 'A', '1.00', '', '', '1,235.100000', '1,230.00', 'Column']
您可以继续使用
StringIO
或任何东西,但是传入一个列表会使示例代码更简单:)。如果您实际上有一个文件对象,您甚至可以在将行馈送到阅读器之前使用一个简单的生成器来转换这些行:

def transform(file):
   for line in file:
       yield line.replace('""', '|')

with open('foo') as fin:
    reader = csv.reader(transform(fin), quotechar='|')
    ...

transform
可以根据您的喜好变得复杂--例如,如果出于某种原因需要保留引号。

我不确定这是否足够好,但是:

>>> import csv
>>> data = '02 JAN 2014,FEB 2014,A,1.00,,,""1,235.100000"",""1,230.00"",Column'
>>> reader = csv.reader([data.replace('""', '|')], quotechar='|')
>>> next(reader)
['02 JAN 2014', 'FEB 2014', 'A', '1.00', '', '', '1,235.100000', '1,230.00', 'Column']
您可以继续使用
StringIO
或任何东西,但是传入一个列表会使示例代码更简单:)。如果您实际上有一个文件对象,您甚至可以在将行馈送到阅读器之前使用一个简单的生成器来转换这些行:

def transform(file):
   for line in file:
       yield line.replace('""', '|')

with open('foo') as fin:
    reader = csv.reader(transform(fin), quotechar='|')
    ...

transform
可以变得像你喜欢的那样复杂--例如,如果你出于某种原因需要保留引号。

处理这个问题的最佳方法是修复你的输入文件;列开头的两个引号字符一起被视为带引号的空值,并在正常引号规则生效时从输入中删除。末尾的双引号被视为值的一部分

您可以通过对每行进行后处理来修复事后的值:

def rejoin_quoted(row):
    new_row = []
    it = iter(row)
    for col in it:
         new_row.append(col)
         if col.startswith('""'):
             new_col = [col]
             for col in it:
                 new_col.append(col)
                 if col.endswith('""'):
                     new_row[-1] = ','.join(new_col).strip('"')
                     break
    return new_row
演示:


处理此问题的最佳方法是修复输入文件;列开头的两个引号字符一起被视为带引号的空值,并在正常引号规则生效时从输入中删除。末尾的双引号被视为值的一部分

您可以通过对每行进行后处理来修复事后的值:

def rejoin_quoted(row):
    new_row = []
    it = iter(row)
    for col in it:
         new_row.append(col)
         if col.startswith('""'):
             new_col = [col]
             for col in it:
                 new_col.append(col)
                 if col.endswith('""'):
                     new_row[-1] = ','.join(new_col).strip('"')
                     break
    return new_row
演示:


一种方法是稍微修改数据,以便显式指定引号字符和转义字符:

data = '02 JAN 2014,FEB 2014,A,1.00,,,"\"1,235.100000\"","\"1,230.00\"",Column'
parsed = csv.reader(data, delimiter=',', quotechar='"', escapechar='\\')

一种方法是稍微修改数据,以便显式指定引号字符和转义字符:

data = '02 JAN 2014,FEB 2014,A,1.00,,,"\"1,235.100000\"","\"1,230.00\"",Column'
parsed = csv.reader(data, delimiter=',', quotechar='"', escapechar='\\')

你想退货什么<代码>“1235.1000000”
<代码>“1235.1000000”
1235.1000000
?@mgilson:ah,
csv
模块也会在默认情况下将列一分为二。双引号被视为一个空字符串,并从列中删除。@MartijnPieters--我不太确定csv本身是否是用于此作业的工具。。。我认为它只允许引用一个字符,而不是两个字符。当然,你可以
str.replace
(或者
re.sub
,如果你真的需要的话)你可以在另一个单独的字符上引用两个字符…@mgilson我希望它返回这个数字而不分开它。@alpertokgz--但是你想保留引号吗?你想返回什么<代码>“1235.1000000”<代码>“1235.1000000”
1235.1000000
?@mgilson:ah,
csv
模块也会在默认情况下将列一分为二。双引号被视为一个空字符串,并从列中删除。@MartijnPieters--我不太确定csv本身是否是用于此作业的工具。。。我认为它只允许引用一个字符,而不是两个字符。当然,您可以
str.replace
(或者
re.sub
,如果您确实需要的话)将您可以引用的另一个字符的2个字符替换为…@mgilson我希望它返回这个数字而不将其分开。@alpertokgz--但是您想保留引号吗?为什么您的输出列表
“1235.100000”
作为两列?我得到了正确的输出,您发布的输出不正确。:-)@马蒂安皮特斯是的。。。我应该注意到这一点。最初,我复制/粘贴了OP的
数据
行(带双引号),这实际上创建了一个不带引号的字符串:)。我发现了这一点并修复了代码中的引号,但我忘了修复输出。为什么您的输出列表将
“1235.100000”“
列为两列?我得到了正确的输出,您发布的输出就是不正确。:-)@马蒂安皮特斯是的。。。我应该注意到这一点。最初,我复制/粘贴了OP的
数据
行(带双引号),这实际上创建了一个不带引号的字符串:)。我捕捉到了这一点并修复了代码中的引号,但我忘记了修复输出。