嵌套的dictreader未重置

2024-03-29 11:13:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有嵌套的DictReader迭代器,但是我注意到for build in buildingfor row in location中的每次迭代后都没有重置,这导致它只在第一次迭代之后将其与生成中的最后一个对象进行比较。为什么不复位?在

import csv

building = csv.DictReader(open('tblBuilding.csv', newline=''), delimiter=',', quotechar='"')
purpose = csv.DictReader(open('tblPurpose.csv', newline=''), delimiter=',', quotechar='"')
room = csv.DictReader(open('tblRoom.csv', newline=''), delimiter=',', quotechar='"')
location = csv.DictReader(open('Locations.csv', newline=''), delimiter=',', quotechar='"')

data, i = {}, 0

for row in location:
    result = {}
    for build in building:
        if row['Build'] == build['BuildingName']:
            result['BuildingID'] = build['BuildingID']

Tags: csvinbuildfornewlinelocationresultopen
1条回答
网友
1楼 · 发布于 2024-03-29 11:13:47

它们不会重置,因为基础文件对象不会重置。您可以再次将文件倒带到开始处,但要考虑到第一行是标题行,所以也跳过它:

building_file = open('tblBuilding.csv', newline='')
building = csv.DictReader(building_file, delimiter=',', quotechar='"')


for row in location:
    result = {}
    for build in building:
        if row['Build'] == build['BuildingName']:
            result['BuildingID'] = build['BuildingID']
    building_file.seek(0)  # rewind the underlying file object to the start again
    next(building)  # skip header row

但是首先,您不应该在嵌套的CSV文件上循环。在处理位置之前,将建筑信息存储在字典中:

^{pr2}$

buildings字典现在将BuildingName映射到BuildingID值。现在,您可以在O(1)恒定时间内查找建筑物,而不必在每个位置的所有CSV行上循环

for row in location:
    result = {}
    building_id = buildings.get(row['Build'])
    if building_id:
        result['BuildingID'] = building_id

相关问题 更多 >