我有一个具有以下结构的csv文件:
"txNomeParlamentar";"ideCadastro";"nuCarteiraParlamentar";"nuLegislatura";"sgUF"
"AVANTE;1;1;2015;PP"
我需要他留下来像这样
"txNomeParlamentar";"ideCadastro";"nuCarteiraParlamentar";"nuLegislatura";"sgUF"
"AVANTE";"1";"1";"2015";"PP"
我从其他人那里收到了这个.csv文件,所以我不知道转换是如何完成的。我尝试使用以下代码失败:
input_fd = open("/home/gustavo/Downloads/Redes/Despesas/csvfile.csv", 'r')
output_fd = open('dados_2018_1.csv', 'w')
for line in input_fd.readlines():
line.replace("\"","")
output_fd.write(line)
input_fd.close()
output_fd.close()
是否可以进行此更改,还是必须将文件从xml文件转换为csv,并在转换过程中进行此更改?
答案 0 :(得分:1)
几件事。首先,您没有csv文件,因为在csv文件中,定界符在定义上是逗号。我假设您希望数据文件中的值(1)保持用分号分隔[为什么不修复它并使其成为逗号?]和(2)您希望每个值都用引号引起来。
如果是这样,我认为这会起作用:
# data reader
in_file = 'data.txt'
out_file = 'fixed.txt'
output = open(out_file, 'w')
with open(in_file, 'r') as source:
for line in source:
# split by semicolon
data = line.strip().split(';')
# remove all quotes found
data = [t.replace('"','') for t in data]
for item in data[:-1]:
output.write(''.join(['"', item, '"',';']))
# write the last item separately, without the trailing ';'
output.write(''.join(['"', item, '"']))
output.write('\n')
output.close()
如果目标用户是python,则应考虑用逗号(正确的csv格式)替换分号,并放弃引号。无论如何,python从csv读取的所有内容都将作为字符串接收。
答案 1 :(得分:1)
使用csv
模块。
例如:
import csv
with open(filename) as csvfile:
reader = csv.reader(csvfile, delimiter=";")
headers = next(reader) #Read Headers
data = [row.strip('"').split(";") for row in csvfile] #Format data
with open(filename, "w") as csvfile_out:
writer = csv.writer(csvfile_out, delimiter=";")
writer.writerow(headers) #Write Headers
writer.writerows(data) #Write data
答案 2 :(得分:1)
首先:告诉reader
使用delimiter=";"
和quoting=csv.QUOTE_NONE
。这将正确分割第二行,这是包含分隔符的字符串文字,您希望将其分隔。我们将调整该数据以除去引号(否则我们的输出将被引号括起来的字符串,例如'"txNomeParlamentar"'
等)。
import csv
with open('file.txt') as f:
reader = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE)
data = [list(map(lambda s: s.replace('"', ''), row)) for row in reader]
然后:我们用delimiter=";"
和quoting=csv.QUOTE_ALL
写回文件,以确保每个项目都用引号引起来
with open('out.txt', 'w', newline='') as o:
writer = csv.writer(o, delimiter=";", quoting=csv.QUOTE_ALL)
writer.writerows(data)
输入:
"txNomeParlamentar";"ideCadastro";"nuCarteiraParlamentar";"nuLegislatura";"sgUF"
"AVANTE;1;1;2015;PP"
输出:
"txNomeParlamentar";"ideCadastro";"nuCarteiraParlamentar";"nuLegislatura";"sgUF"
"AVANTE";"1";"1";"2015";"PP"
答案 3 :(得分:-1)
如果您先稍微按摩一下输入数据,则可以使用csv
模块来完成此操作。
import csv
#input_csv = '/home/gustavo/Downloads/Redes/Despesas/csvfile.csv'
input_csv = 'gustavo_input.csv'
output_csv = 'dados_2018_1.csv'
with open(input_csv, 'r', newline='') as input_fd, \
open(output_csv, 'w', newline='') as output_fd:
reader = csv.DictReader(input_fd, delimiter=';')
writer = csv.DictWriter(output_fd, delimiter=';',
fieldnames=reader.fieldnames,
quoting=csv.QUOTE_ALL)
first_field = reader.fieldnames[0]
for row in reader:
fields = row[first_field].split(';')
newrow = dict(zip(reader.fieldnames, fields))
writer.writerow(newrow)
print('done')