【问题标题】:Filtering an ordered dictionary by value after reading in using dictionary reader使用字典阅读器读入后按值过滤有序字典
【发布时间】:2020-03-28 23:36:01
【问题描述】:

您好,我是 Python 的新手。

(我看过一些帖子,我在阅读障碍和难以理解解决方案方面有些挣扎)——如果我遗漏了什么,非常抱歉

我需要能够按值过滤大型 csv 文件。我可以打开文件并使用字典阅读器读取数据,但在过滤器部分遇到了困难。我尝试使用 python filter 命令使其仅与 lambda 函数一起工作(但无法使其工作),因此尝试创建一个过滤器函数,但努力使其也能正常工作。 我已经包含了一个 csv 数据文件的小示例格式,如果有人可以帮助我了解如何通过值部分进行过滤以处理此示例文件,我可以更改更大文件的代码。 因此,例如,使用键 (Name5) 过滤 csv 文件中所有具有“蓝色”(值)的行。 请问有什么帮助吗?

#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

【问题讨论】:

    标签: python csv filtering


    【解决方案1】:

    您可以执行以下操作:

    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 创建一个可迭代对象,其中只有在'Name5' 列中具有'Blue' 的字典(行)。

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多