繁体   English   中英

如何在Python中解析双引号的csv文件?

[英]How to parse a double quoted csv files in Python?

我正在尝试解析一个用"'引用的csv。因此,基本上,该文件如下所示:

"'test1'","'test2'","'test3'","'test4'"
"'value1'","'value2'",,"'value4'"

我尝试解析以下内容:

import csv
from pprint import pprint

inputCsv = "test.csv"

with open(inputCsv, 'r', newline='') as csvfile:
    dictReader = csv.DictReader(csvfile, quotechar='"', delimiter=',',
                 quoting=csv.QUOTE_ALL, doublequote=True)
    for line in dictReader:
        pprint(line)
        # print(line["'test1'"]) # works, but only with "'test1'", not "test1" or 'test1'; also result is 'value1' not value1

我希望键为test1这样我就可以使用line["test1"] (而不是line["'test1'"] )来访问它,并且将值设为value1 ,而无需使用其他引号。

是否可以不遍历整个字典并在分析后删除每个元素的引号,这是否可能?

在线示例: https : //repl.it/repls/WoefulDeafeningMacroinstruction

您可以定义自己的阅读器来解决迭代过程中的问题(警告:未经测试的代码,但至少应该可以使您入门):

class MyReader(csv.reader):
    def __next__(self):
        row = super().__next__()
        return [value.strip("'") for value in row]

class MyDictReader(csv.DictReader):
    def __init__(self, f, fieldnames=None, restkey=None, restval=None,
                 dialect="excel", *args, **kwds):
        super().__init__(f, fieldnames, restkey, restval, dialect, *args, *kwds)
        self.reader = MyReader(f, dialect, *args, **kwds)

这有点round回,但是如果我们以CSV格式两次读取文件,则会得到我们想要的:

import csv
from pprint import pprint
from io import StringIO

inputCsv = "test.csv"

with open(inputCsv, 'r', newline='') as csvfile:
    csvReader = csv.reader(csvfile, quotechar='"', delimiter=',')
    dequotedStringIO = StringIO()
    csvWriter = csv.writer(dequotedStringIO, quoting=csv.QUOTE_NONE)
    csvWriter.writerows(csvReader)
    dequotedLines = dequotedStringIO.getvalue().splitlines()
    dictReader = csv.DictReader(dequotedLines, quotechar="'")
    for line in dictReader:
        print(line['test1'])

因此,首先我们有一个直接的csv.reader ,它将解析外部引号; 然后我们将所有数据发送回csv.writer并告诉它不要引用任何内容。 实际上,这会以尊重CSV语义的方式剥离外部双引号,然后您会得到一个仅包含单引号的兼容CSV文件,您可以将其传递到csv.DictReader以获得所需的最终结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM