在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
相关产品推荐
相关产品推荐

