Python 在使用字典读取器中读取后按值筛选有序字典
嗨,我对Python完全陌生 (我看了一些帖子,我有点读写困难,很难理解解决办法)-如果我错过了什么,我很抱歉 我需要能够过滤一个大的csv文件的价值。我可以使用字典阅读器打开文件并读入数据,但过滤部分很难处理。我曾尝试使用python filter命令使lambda函数可以实现这一点(但无法实现),因此我尝试创建了一个filter函数,但也很难实现这一点。 我已经包括了一个csv数据文件的小示例格式,如果有人能帮助我理解如何让这个按值过滤部分在这个示例文件上工作,我可以更改一个更大文件的代码。 例如,使用键(Name5)过滤csv文件中所有带有“blue”(值)的行。 需要帮忙吗Python 在使用字典读取器中读取后按值筛选有序字典,python,csv,filtering,Python,Csv,Filtering,嗨,我对Python完全陌生 (我看了一些帖子,我有点读写困难,很难理解解决办法)-如果我错过了什么,我很抱歉 我需要能够过滤一个大的csv文件的价值。我可以使用字典阅读器打开文件并读入数据,但过滤部分很难处理。我曾尝试使用python filter命令使lambda函数可以实现这一点(但无法实现),因此我尝试创建了一个filter函数,但也很难实现这一点。 我已经包括了一个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
您可以执行以下操作:
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)
它仅使用列
'Name5'
中包含'Blue'
的词典(行)创建一个iterable,您可以执行以下操作:
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)
它仅使用列'Name5'
中包含'Blue'
的字典(行)创建一个iterable