读取CSV文件并写入功能导致另一个

时间:2019-01-17 11:48:30

标签: python csv

我有一个CSV文件,我想在该文件上进行处理并将结果保存到output.csv文件中。

这是我的customer.csv文件:

id, email, first_name, last_name, institution, creation_date, modification_date, country
1;tar.ber@test.eu;tar;ber;EDTG,TGD;;;
2;val.dzz@test.eu;var;dzz;Test with , inside;;;
...

某些机构字段内部有,。因此,我想在每个机构领域设置" "

#Input data
1;tar.ber@test.eu;tar;ber;EDTG,TGD;;;
2;val.dzz@test.eu;var;dzz;Test with , inside;;;

#Output data
1;tar.ber@test.eu;tar;ber;"EDTG,TGD";;;
2;val.dzz@test.eu;var;dzz;"Test with , inside";;;

这是我的代码:

import csv
import re

with open('customer.csv', 'r') as csvFile:
    reader = csv.reader(csvFile, delimiter=";")
    writer = csv.writer(open("output.csv", 'w'))
    for row in reader:
        id = row[0]
        email= row[1]
        first_name = row[2] 
        last_name = row[3] 
        institution = row[4]
        modification_date = row[5]
        country = row[6] 
        creation_date = row[7]
        writer.writerow(id+';'+email+';'+first_name+';'+last_name+';"'+institution+'";'+modification_date+';'+country+';'+creation_date)

在我的终端机中,它可以给我:

1;tar.ber@test.eu;tar;ber;"EDTG,TGD";;;
2;val.dzz@test.eu;var;dzz;"Test with , inside";;;

但是在我的output.csv文件中,我得到了:

1,;,t,a,r,.,b,e,r,@,t,e,s,t,.,e,u,;,t,a,r,;,b,e,r,;,"""",E,D,T,G,,T,G,D,"""",;,;,;

我不明白为什么?

2 个答案:

答案 0 :(得分:0)

您应该创建一个字符串列表,而不是创建要传递给writer.writerow的字符串。

        writer.writerow([id, email, first_name, last_name, institution, modification_date, country, creation_date])

请注意,该行已经是您想要的,因此您可以将其简化为

import csv
import re

with open('customer.csv', 'r') as csvFile:
    reader = csv.reader(csvFile, delimiter=";")
    writer = csv.writer(open("output.csv", 'w'), delimiter=";", quoting=QUOTE_NONNUMERIC)
    for row in reader:
        writer.writerow(row)

此外,您还应该为编写器添加正确的定界符。

最后,我认为csv模块将正确处理引用。也就是说,如果定界符为“,”它将在数据中引用“,”,否则将不会。因此,根据csv规范,在机构周围加引号的引用是错误的。

但是,如果仍然需要引号,则可以使用csv库的quoting关键字参数。这些是它支持的常量。 https://docs.python.org/2/library/csv.html#csv.QUOTE_ALL。不幸的是,它不支持仅引用所需的特定字段(除非将定界符更改为','),但可以引用所有字段或所有非数字字段。

要解释您所看到的行为:writerow会迭代给出的所有内容,因此会在您构造并解释为单个字段的字符串上进行迭代,从而添加“ ”。

答案 1 :(得分:0)

主要问题是您需要传递writer.writerow()一系列项目,而不是字符串。为了获得所需的定界符,在创建delimiter=";"csv.writer对象时需要指定csv.reader。还有其他一些问题,例如您如何open()的csv文件,应该始终指定newline=''以确保正确处理换行符。

我还添加了一行将标题行复制到输出文件。无论如何,这是output.csv运行后包含的内容:

id, email, first_name, last_name, institution, creation_date, modification_date, country
1;tar.ber@test.eu;tar;ber;EDTG,TGD;;;
2;val.dzz@test.eu;var;dzz;Test with , inside;;;

这是经过修改的代码:

import csv

with open('customer.csv', 'r', newline='') as csvFile, \
     open("output.csv", 'w', newline='') as outFile:
        reader = csv.reader(csvFile, delimiter=";")
        writer = csv.writer(outFile, delimiter=";")

        writer.writerow(next(reader))  # Copy header row.
        for row in reader:
            id, email, first_name, last_name, institution = row[0:5]
            modification_date, country, creation_date = row[5:8]
            writer.writerow([id, email, first_name, last_name, institution,
                             modification_date, country, creation_date])