You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在with open读取CSV文件的代码块中为什么仅1个for循环能生效?

问题根因

csv.DictReader 属于迭代器类型,对它进行一次完整遍历后,文件指针会移动到CSV文件末尾,后续再遍历同一个DictReader实例就不会返回任何数据。另外你给同一个文件句柄创建两个DictReader实例也不会生效,因为两个Reader共享同一个文件指针,第一个Reader读取完内容后,第二个Reader拿到的也是文件末尾的空内容。

解决方法

推荐你第一次读取文件时就把所有行数据存入内存列表,后续所有计算都遍历这个列表即可,不需要反复读取文件,修正后的示例代码如下:

import csv

total_population = 0
total_area = 0
# 用列表存储所有行数据,避免反复读文件
rows = []

with open("C:/Users/Aditya/Desktop/table1.csv", newline="") as csvfile:
    dict_reader = csv.DictReader(csvfile)
    # 第一次遍历直接把所有行存到列表里,同时提前转好数值类型,避免后续重复转换
    for row in dict_reader:
        row["Population"] = float(row["Population"])
        row["Area"] = float(row["Area"])
        row["Density"] = float(row["Density"])
        rows.append(row)
        # 顺便计算总和,省得多遍历一次
        total_population += row["Population"]
        total_area += row["Area"]

average_density = 7910157000/122162000

def change_population(c_pop, c_den, c_area):
    if c_den < average_density:
        delta_pop = average_density*c_area - c_pop
    elif c_den > average_density:
        delta_pop = c_pop - average_density*c_area
    else:
        delta_pop = 0
    return delta_pop

print(f"{total_population} people, {total_area} km2")

# 直接遍历内存里的列表,想遍历多少次都可以
for row in rows:
    change = change_population(row["Population"], row["Density"], row["Area"])
    row["Population"] = str(row["Population"] + change)
    print(row)

如果你的CSV文件体积极大,不想把全量数据存入内存,也可以每次需要遍历内容时重新打开一次文件句柄,不要复用同一个文件对象创建多个Reader。

内容的提问来源于stack exchange,提问作者p1nk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:24:03