Python CSV读取器/写入器处理引号:如何将行字段包装在引号中? (将三重引号作为输出)

时间:2015-06-22 23:54:42

标签: python csv

我在python中遇到了csv阅读器和编写器的问题。每当我尝试获取一个CSV文件并将列数从大约37个减少到6个时,这就是我得到的那种输出。一行示例:

0," JOHNSON,JOHN J。",JOHN J. JOHNSON,TECH879,检验技师,汽车检验单位

注意引用了第二个字段。这是我在文本编辑器中查看时看到的内容。我想要引用所有字段。这儿存在一个问题。首先,我的代码,它的一个例子:

import os
import csv
alpha = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
with open(os.getcwd()+'/dl1/filepfr062220155.csv','w') as fp:
identity = 0
for i in alpha:
    csvholder = open(os.getcwd()+'/dl1/pfr/'+i+'.csv','rb')
    spamreader = csv.reader(csvholder, delimiter=',')
    for row in spamreader:
        if 'Sort Name' in row[0]:
                pass
        else:
                ###SEE HERE###
                data = [[str(identity),row[0],row[1],row[2],row[3],row[37]]]
                identity+=1
                a = csv.writer(fp,delimiter=',',quotechar='"')
                a.writerows(data)

问题是,关于我在哪里标记" ###在这里看到###,我尝试用引号包装未加引号的字段,如下所示:

data = [['"'+str(identity)+'"',row[0],'"'+row[1]+'"','"'+row[2]+'"','"'+row[3]+'"','"'+row[37]+'"']]

但是这给了我看起来像这样的输出,带有三引号,这是不可接受的......就像这样:

""" 4"""," JOHNSON,JOHN W。","" " JOHN W. JOHNSON""",""" TEC5681""","& #34;"检验技术人员""","""马达车辆检查单元"""

这些行的原始形式是这样的:

" NAME"" NAME"" NAME"" NAME"等等...

所以我不知道为什么在最终输出中只引用了一个字段。我要么引用所有引用的字段,要么引用它们。

我已经尝试过和没有" quotechar"在读者和作者,所有这些组合。

因此,如果您可以告诉我如何保留原始文件中的原始引用或如何解决此三重引用问题,以便我可以手动重新格式化,那就太棒了。

1 个答案:

答案 0 :(得分:5)

quotechar仅表示作者应该使用什么字符进行引用。你需要它quote=csv.QUOTE_ALL。像这样创建你的作家:

a = csv.writer(fp, quoting=csv.QUOTE_ALL)

quoting默认为csv.QUOTE_MINIMAL,这意味着只有当包含分隔符时才会引用字段,这就是为什么它只引用"约翰逊,约翰J。"。

(请注意,我遗漏了delimiter,因为它已默认为',',但如果您愿意,当然不会明确地定义它会让您受伤。)

quoting和其他方言参数是csv.writer的关键字参数,在csv模块的Python文档中根据第13.1.2节进行了描述。