Python遍历地址文件未循环后续内容,计数器重置失效问题
问题分析与修复
核心错误点
- 计数器重置逻辑错误:
line_counter == 1是比较运算符,无法完成赋值,应该改为line_counter = 1,这是导致计数器持续递增、后续地址解析逻辑永远不触发的核心原因。 - 地址变量未重置:处理完一组地址后,
new_address没有清空,导致后续循环一直复用第一组地址的内容。 - 城市索引计算偏差:使用原始行
each_line的长度计算city_end,但原始行包含换行符,会导致索引计算错误,应该用去除空白后的city_state_zip长度来计算。 - 表头可能重复写入:原逻辑中表头会在
line_counter == 0时写入,若计数器正常重置会重复写入表头,需将表头写入放在循环外部。 - 文件操作效率低下:每次调用
save_file都打开/关闭文件,频繁IO操作影响性能。
修正后的代码
starter_file = 'addresses.csv' output_file = 'new_address.csv' def save_file(filename, file_mode, content): with open(filename, mode=file_mode, encoding='utf-8') as f: f.write(content) # 提前写入表头,确保只执行一次 save_file(output_file, 'w', 'street, city, state, zip, coordinates\n') line_counter = 1 # 直接从第一行地址开始计数 new_address = '' with open(starter_file, mode='r') as map_data: for each_line in map_data.readlines(): # 跳过空行,避免干扰计数逻辑 if not each_line.strip(): continue if line_counter == 1: # 处理街道行 new_address = each_line[1:].strip() elif line_counter == 2: # 处理城市、州、邮编行 city_state_zip = each_line.strip() # 用处理后的字符串长度计算,排除换行符干扰 city_end = len(city_state_zip) - 8 city = city_state_zip[:city_end].strip() state = city_state_zip[city_end:city_end+2].strip() zip_code = city_state_zip[-5:].strip() new_address = f"{new_address}, {city}, {state}, {zip_code}" elif line_counter == 3: # 处理坐标行 coordinates = each_line.strip().replace(',', ';') new_address = f"{new_address}, {coordinates}\n" save_file(output_file, 'a', new_address) # 重置计数器和地址变量,准备处理下一组地址 line_counter = 0 new_address = '' print(f'#{line_counter} >> ', new_address) line_counter += 1
关键修改说明
- 修复计数器赋值:处理完坐标后将计数器重置为0,加1后回到1,重新开始下一组地址的解析。
- 清空地址变量:每完成一组地址写入后,清空
new_address,避免旧内容残留。 - 修正索引计算:使用
len(city_state_zip)替代原始行长度,排除换行符对索引的影响。 - 表头单独写入:在循环前一次性写入表头,避免重复写入。
- 添加空行过滤:跳过文件中的空行,防止无效行打乱计数逻辑。
- 优化字符串拼接:使用f-string替代传统拼接方式,让代码更简洁易读。
修复后程序会正确遍历每一组地址(每3行一组),依次解析街道、城市州邮编、坐标,写入新文件后自动重置状态,处理下一组地址,不会再重复输出第一组内容。
内容的提问来源于stack exchange,提问作者Sabrina Sanchez
相关产品推荐
相关产品推荐

