Как написать сценарий, используя фактические csv-файлы, а не StringIO

#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 » в качестве столбца.