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