Как отфильтровать и записать несколько файлов в Python? - PullRequest
0 голосов
/ 31 марта 2020

Я новичок в python и застрял в этом проекте на несколько дней, если кто-нибудь может помочь, спасибо.

Я пытаюсь записать в несколько выходных файлов, каждый выходной файл содержит результаты фильтра из одного исходного входного файла. Я поместил операторы print в строку ниже фильтра, чтобы показать мне, что «элемент» передается в оператор, и это происходит, но всякий раз, когда я просматриваю выходной файл, все, что содержится, это заголовки. Так, например, уникальный список из столбца 5 в CSV-файле красный, синий, зеленый. Выходной файл создается, связанный с каждым цветом, но его содержимое всегда пустое.

Выходные данные должны быть, когда элемент = синий Имя1, Имя2, Имя3, Имя4, Имя5, Имя6, Имя7, Имя8 1,2 , 3,4, Синий, 6,7,8 1,2,3,4, Синий, 6,7,8 1,2,3,4, Синий, 6,7,8

Вывод должен быть, когда элемент = красный 1,2,3,4, красный, 6,7,8 1,2,3,4, красный, 6,7,8 1,2,3,4, красный, 6,7 , 8

Вывод должен быть, когда элемент = зеленый

1,2,3,4, зеленый, 6,7,8

Программа ниже

import csv
# opens a the input file and reads in the data
with open('Test_colours_in.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
# prints list of unique values in column 5 of csv of input file
    my_list = set()
    for line in csv_reader:
        my_list.add(line['Name5'])
    print(my_list)

# takes these unique values and creates files associated with each unique value
    for item in my_list:
        with open(item + '_'+'Test.csv', 'w', newline='') as new_file:
            fieldnames = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6', 'Name7', 'Name8']
            csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames)
            csv_writer.writeheader()

# filters the original file for each item in the list of unique values and writes them to respective file

            filtered = filter(lambda r: r['Name5'] == item, csv_reader)
            for row in filtered:
                csv_writer.writerow(row)
входной файл CSV

Имя1, Имя2, Имя3, Имя4, Имя5, Имя6, Имя7, Имя7, Имя8 1,2,3,4, Красный, 6,7,8 1,2,3,4, Синий, 6, 7,8 1,2,3,4, синий, 6,7,8 1,2,3,4, синий, 6,7,8 1,2,3,4, красный, 6,7,8 1, 2,3,4, красный, 6,7,8 1,2,3,4, зеленый, 6,7,8

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вам необходимо возвращаться к началу файла перед каждым фильтром.

Вставьте csv_file.seek (0) перед строкой фильтра в вашем коде следующим образом.

csv_file.seek(0) # Reposition to front of file
filtered = filter(lambda r: r['Name5'] == item, csv_reader)

Объяснение

Следующий фрагмент кода помещает вас в конец файла

for line in csv_reader:
    my_list.add(line['Name5'])

Также:

filtered = filter(lambda r: r['Name5'] == item, csv_reader)
for row in filtered:
    csv_writer.writerow(row)

Исправление - это изменение положения в начале файла перед каждым фильтром, поэтому вы фильтруете весь файл по своему усмотрению.

0 голосов
/ 31 марта 2020

Почему вы не используете pandas?

import pandas as pd

df_col = pd.read_csv('colours.csv')

colours = ['Red', 'Blue', 'Green']

for colour in colours:
   df_col[df_col['Name5'] == colour].to_csv(colour + '_out.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...