使用python格式化csv文件

时间:2019-05-29 02:52:12

标签: python

我有一个具有以下结构的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,并在转换过程中进行此更改?

4 个答案:

答案 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"

enter image description here

输出:

"txNomeParlamentar";"ideCadastro";"nuCarteiraParlamentar";"nuLegislatura";"sgUF"
"AVANTE";"1";"1";"2015";"PP"

enter image description here

答案 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')