在Python中处理构造一致性差的CSV
使用CSV接收和处理我几乎无法控制的来自多个源的文件。这里的问题是,文件的原始进程可能会对所有字段双引号、对所有字段单引号或不使用引号。这里的另一个挑战是一些数据字段可能包含单引号/撇号、双引号或逗号,我必须用空格替换它们 CSV阅读器使我能够通过对话框设置引号字符,但不同的文件可能会有所不同 两个字段,ID字符串不能包含任何引号,它们必须被剥离,并且名称字符串可能包含引号 它可以是: id123,钻头-1/4“,其他字段1 或 1d234,“10'杆”,其他场1 或 id345,猴子盒子,其他领域1 或 “id456”,“火腿三明治,不新鲜”,“其他领域1” 所以最大的问题是我可以用CSV阅读器自己处理其中的任何一个,但是我如何处理所有这些呢在Python中处理构造一致性差的CSV,python,csv,Python,Csv,使用CSV接收和处理我几乎无法控制的来自多个源的文件。这里的问题是,文件的原始进程可能会对所有字段双引号、对所有字段单引号或不使用引号。这里的另一个挑战是一些数据字段可能包含单引号/撇号、双引号或逗号,我必须用空格替换它们 CSV阅读器使我能够通过对话框设置引号字符,但不同的文件可能会有所不同 两个字段,ID字符串不能包含任何引号,它们必须被剥离,并且名称字符串可能包含引号 它可以是: id123,钻头-1/4“,其他字段1 或 1d234,“10'杆”,其他场1 或 id345,猴子盒子,其他
我知道最明显的答案是让我的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文件的设置。我将添加您的新测试用例,看看是否可以制作一个工作示例。