Фильтрация упорядоченного словаря по значению после чтения с использованием программы чтения словаря - PullRequest
0 голосов
/ 28 марта 2020

Привет, я совершенно новичок в Python.

(я просматривал посты, в которых немного борюсь с дислексией и испытываю трудности с пониманием решений) - извините, если что-то пропустил

Мне нужно иметь возможность фильтровать большой CSV-файл по значению. Я могу открыть файл и прочитать данные, используя средство чтения словаря, но борясь с частью фильтра. Я пытался заставить это работать только с лямбда-функцией, используя команду фильтра python (но не мог заставить ее работать), а затем попытался создать функцию фильтра, но изо всех сил пытался заставить это работать. Я включил небольшой пример формата файла данных CSV, и если кто-нибудь может помочь мне понять, как заставить эту фильтрацию по значению работать с этим файлом примера, я могу изменить код для файла большего размера. Так, например, чтобы отфильтровать файл CSV для всех строк с «синим» (значение), используя ключ (Name5). Любая помощь, пожалуйста?

#start of program  

import csv


#function below intended to iterate over key value pairs in csv file 
# after read in by dictionary reader 

def filter_the_dict(dictObj, callback):

    newDict = dict()

    # Iterate over all the items in dictionary

    for (key, value) in dictObj.items():

        if callback((key, value)):

            newDict[key] = value

    return newDict

#end of function call

# code below opens csv file using dictionary reader using headers as keys and
# rows underneath as pairs. Later I want to be able to filter for column or rows

with open('Test_colours_in.csv', 'r') as csv_file:

    csv_reader = csv.DictReader(csv_file)

    with open('Test_colours_out.csv', 'w') as new_file:

        fieldnames = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6', 'Name7', 'Name8']

        csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames)

        csv_writer.writeheader()

        for line in csv_reader:

            del line['Roll']

            newDict = filter_the_dict(csv_reader, lambda x: x[5] == 'Blue')

            print(newDict)

        csv_writer.writerow(newDict)

#****************************************
csv example file

Name1,Name2,Name3,Name4,Name5,Name6,Name7,Name8
1,2,3,4,Red,6,7,8
1,2,3,4,Blue,6,7,8
1,2,3,4,Blue,6,7,8
1,2,3,4,Blue,6,7,8
1,2,3,4,Red,6,7,8
1,2,3,4,Red,6,7,8
1,2,3,4,Green,6,7,8
1,2,3,4,Green,6,7,8
1,2,3,4,Green,6,7,8
1,2,3,4,Green,6,7,8

1 Ответ

2 голосов
/ 28 марта 2020

Вы можете сделать следующее:

import csv

with open('Test_colours_in.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)

    with open('Test_colours_out.csv', 'w') as new_file:
        fieldnames = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6', 'Name7', 'Name8']
        csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames)
        csv_writer.writeheader()

        filtered = filter(lambda r: r['Name5'] == 'Blue', csv_reader)

        for row in filtered:
            csv_writer.writerow(row)

Вывод

Name1,Name2,Name3,Name4,Name5,Name6,Name7,Name8
1,2,3,4,Blue,6,7,8
1,2,3,4,Blue,6,7,8
1,2,3,4,Blue,6,7,8

Ключом к решению проблемы является строка:

filtered = filter(lambda r: r['Name5'] == 'Blue', csv_reader)

Создает итерацию, используя filter , только со словарями (строками), которые имеют 'Blue' в столбце 'Name5'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...