#python #csv #rename #import-csv
Вопрос:
Как я могу написать следующий сценарий ниже, который переименовывает и переупорядочивает заголовки столбцов с использованием импортированной строки ввода-вывода в формат использования реальных csv-файлов, поскольку набор данных слишком велик.
from io import StringIO
from collections import OrderedDict
import csv
mystr = StringIO("""A;B;C;D
1;2;3;4
5;6;7;8""")
order = ['B', 'C', 'A', 'D']
# define renamed columns via dictionary
renamer = {'C': 'C2'}
# define column names after renaming
new_cols = [renamer.get(x, x) for x in order]
# replace mystr as open(r'file.csv', 'r')
with mystr as fin, open(r'C:tempout.csv', 'w', newline='') as fout:
# define reader / writer objects
reader = csv.DictReader(fin, delimiter=';')
writer = csv.writer(fout, delimiter=';')
# write new header
writer.writerow(new_cols)
# iterate reader and write row
for item in reader:
writer.writerow([item[k] for k in order])
Ответ №1:
Ваша основная проблема с вашим кодом заключается в том, что with
код нуждается в отступе, чтобы он работал. Ниже приведены незначительные изменения в вашем коде, которые позволяют ему считывать данные из одного csv и записывать в другой:
from io import StringIO
from collections import OrderedDict
import csv
order = ['B', 'C', 'A', 'D']
# define renamed columns via dictionary
renamer = {'C': 'C2'}
# define column names after renaming
new_cols = [renamer.get(x, x) for x in order]
# replace mystr as open(r'file.csv', 'r')
with open('C:tmpin.csv') as fin, open(r'C:tempout.csv', 'w', newline='') as fout:
# define reader / writer objects
reader = csv.DictReader(fin, delimiter=';')
writer = csv.writer(fout, delimiter=';')
# write new header
writer.writerow(new_cols)
# iterate reader and write row
for item in reader:
writer.writerow([item[k] for k in order])
Комментарии:
1. Это будет означать, что в вашем входном файле/данных нет столбца » A » в качестве столбца.