在Python中处理构造一致性差的CSV

在Python中处理构造一致性差的CSV,python,csv,Python,Csv,使用CSV接收和处理我几乎无法控制的来自多个源的文件。这里的问题是,文件的原始进程可能会对所有字段双引号、对所有字段单引号或不使用引号。这里的另一个挑战是一些数据字段可能包含单引号/撇号、双引号或逗号,我必须用空格替换它们 CSV阅读器使我能够通过对话框设置引号字符,但不同的文件可能会有所不同 两个字段,ID字符串不能包含任何引号,它们必须被剥离,并且名称字符串可能包含引号 它可以是: id123,钻头-1/4“,其他字段1 或 1d234,“10'杆”,其他场1 或 id345,猴子盒子,其他

使用CSV接收和处理我几乎无法控制的来自多个源的文件。这里的问题是,文件的原始进程可能会对所有字段双引号、对所有字段单引号或不使用引号。这里的另一个挑战是一些数据字段可能包含单引号/撇号、双引号或逗号,我必须用空格替换它们

CSV阅读器使我能够通过对话框设置引号字符,但不同的文件可能会有所不同

两个字段,ID字符串不能包含任何引号,它们必须被剥离,并且名称字符串可能包含引号

它可以是:

id123,钻头-1/4“,其他字段1

1d234,“10'杆”,其他场1

id345,猴子盒子,其他领域1

“id456”,“火腿三明治,不新鲜”,“其他领域1”

所以最大的问题是我可以用CSV阅读器自己处理其中的任何一个,但是我如何处理所有这些呢


我知道最明显的答案是让我的DeLorean达到88英里/小时,并停止导致这种疯狂程度的系统,但谁知道我们在哪里可以获得足够的果汁呢?

请举一个确切的例子,如
case1.csv

id123, drill bit - 1/4", otherField1
1d234, "10' Pole", otherField1
id345, box of monkeys, otherField1
"id456", "ham sandwich, stale", "otherField1"
1, 2, 3, 4
foo, ltest, 'l,test', ltest
您的注释示例为
case2.csv

id123, drill bit - 1/4", otherField1
1d234, "10' Pole", otherField1
id345, box of monkeys, otherField1
"id456", "ham sandwich, stale", "otherField1"
1, 2, 3, 4
foo, ltest, 'l,test', ltest
下面使用
嗅探器
类来检测csv方言:

import csv
for file in ('case1.csv','case2.csv'):
    with open(file,newline='') as f:
        dialect = csv.Sniffer().sniff(f.read(1024))
        f.seek(0)
        r = csv.reader(f,dialect)
        for line in r:
            print(line)
输出:

['id123', 'drill bit - 1/4"', 'otherField1']
['1d234', "10' Pole", 'otherField1']
['id345', 'box of monkeys', 'otherField1']
['id456', 'ham sandwich, stale', 'otherField1']
['id123', 'drill bit - 1/4"', 'otherField1']
['1', '2', '3', '4']
['foo', 'ltest', 'l,test', 'ltest']

您可能必须调整嗅探器的
.read()
大小,以防某些文件的开头在前1000字节左右没有带引号的字段。这就是您必须猜测的情况。

使用该代码行:1,2,3,4 foo,ltest,'l,test',ltest get me:OrderedDict([('1','foo'),('2','ltest'),('3','l'),('4','test',(无,['ltest','ltest']),当它应该是3:l时,test@Wes如果您有其他测试用例,请编辑您的问题并将其列在示例中。我确实说明了“使用您的确切示例”(希望它们不完整),您在示例后问“我如何处理所有[示例]“。也就是说,有一个嗅探器类可以猜测特定.csv文件的设置。我将添加您的新测试用例,看看是否可以制作一个工作示例。