我有一个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,"""",;,;,;
我不明白为什么?
答案 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])