Python 嵌套读写器不重置

Python 嵌套读写器不重置,python,csv,python-3.x,Python,Csv,Python 3.x,我有嵌套的DictReader迭代器,但我注意到,对于内置建筑,在位置中的行,中的每次迭代后都不会重置,这导致它仅在第一次迭代后将其与建筑中的最后一个对象进行比较。为什么不复位 import csv building = csv.DictReader(open('tblBuilding.csv', newline=''), delimiter=',', quotechar='"') purpose = csv.DictReader(open('tblPurpose.csv', newline=

我有嵌套的DictReader迭代器,但我注意到,对于内置建筑,在位置中的行,中的
每次迭代后都不会重置,这导致它仅在第一次迭代后将其与建筑中的最后一个对象进行比较。为什么不复位

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']

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

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文件上循环。在处理位置之前,将建筑信息存储在字典中:

with open('tblBuilding.csv', newline='') as building_file:
    building = csv.DictReader(building_file, delimiter=',', quotechar='"')
    buildings = {b['BuildingName']: b['BuildingID'] for b in building}
buildings
字典现在将
BuildingName
映射到
BuildingID
值。现在,您可以在O(1)恒定时间内查找建筑物,而不必在每个位置的所有CSV行上循环:


为什么会“重置”?为什么不会?我认为,就像嵌套for循环一样,每次外部循环运行时,内部循环从头到尾都会运行。但是(很明显!)这并不总是正确的-这取决于在循环中迭代的内容。请参见,谢谢你的解释!
for row in location:
    result = {}
    building_id = buildings.get(row['Build'])
    if building_id:
        result['BuildingID'] = building_id