将JSON数据写入CSV时遇IndexError及空行问题求助
解决CSV索引越界与空行问题
我来帮你搞定这两个头疼的问题,先拆解下错误原因,再给你优化后的代码:
问题根源分析
1. IndexError: list index out of range
你的初始CSV有9行0,0,0,0,0,最后你把第1行(索引0)改成了表头,所以实际能用来填数据的只有索引1到8的8行。但你的循环里i从1开始递增,如果data['features']里的元素数量超过8,i就会跑到9,这时候lines[9]根本不存在,自然就触发索引越界了。
另外,你在循环里反复读取CSV文件,这不仅效率低,还可能因为中间的写入操作导致文件内容变化,让lines的长度变得不可控,进一步加剧索引问题。
2. CSV底部空行问题
虽然你加了newline='',但反复打开、写入文件的操作很容易引入额外空行;最后那句单独的open(...).close()完全是多余的,反而可能带来文件处理的异常。
修复方案与优化代码
我把你的代码重构了一下,一次性读取CSV到内存处理,最后再一次性写入,既解决索引问题,也能消除空行:
import json import csv # 读取JSON数据 json_file = 'LaukiGeojson/Zemdegas.geojson' with open(json_file) as f: geo_data = json.load(f) # 一次性读取CSV内容到内存,避免反复IO操作 csv_path = 'LaukiAnalizes/Zemdegas.csv' with open(csv_path, 'r', newline='') as f: csv_reader = csv.reader(f) csv_lines = list(csv_reader) # 检查features数量是否超过CSV可用数据行(留第一行做表头) max_available_rows = len(csv_lines) - 1 total_features = len(geo_data['features']) if total_features > max_available_rows: print(f"⚠️ 警告:features数量({total_features})超过CSV可用数据行数({max_available_rows}),将只处理前{max_available_rows}条数据") # 填充pH值(从第2行开始,对应索引1) for idx in range(min(total_features, max_available_rows)): current_feature = geo_data['features'][idx] ph_value = current_feature['properties']['pH'] csv_lines[idx + 1][1] = ph_value # idx+1对应数据行,1对应pH列 # 后续添加其他值的话,直接在这里扩展即可: # csv_lines[idx + 1][2] = current_feature['properties']['P'] # csv_lines[idx + 1][3] = current_feature['properties']['K'] # csv_lines[idx + 1][4] = current_feature['properties']['Mg'] # 设置表头 csv_lines[0] = ['ID', 'pH', 'P', 'K', 'Mg'] # 一次性写入所有修改,确保文件正确处理 with open(csv_path, 'w', newline='') as f: csv_writer = csv.writer(f) csv_writer.writerows(csv_lines)
关键优化点
- 用
with语句管理文件:自动帮你处理文件打开/关闭,避免资源泄漏和异常。 - 一次性读写CSV:把所有操作放在内存里完成,减少IO次数,避免中间文件状态变化的问题。
- 添加数据量检查:提前警告你当features数量超过CSV可用行数的情况,从根源避免索引越界。
- 清晰的索引逻辑:用
idx + 1对应数据行(跳过表头行),确保不会超出列表范围。
内容的提问来源于stack exchange,提问作者user13294714
相关产品推荐
相关产品推荐

