Python中csv.reader对象复制报错及copy模块相关问题求助
问题解决:TypeError: descriptor 'copy' for 'dict' objects doesn't apply to a '_csv.reader' object
核心问题分析
csv.reader()返回的是迭代器对象(类型为_csv.reader),不是字典,也不是可直接复制的列表对象,所以用dict.copy()操作它必然报错。- 导入的
copy模块显示灰色,是因为代码里没实际用到它,PyCharm会自动标记未使用的导入。 - PyCharm设置里找不到
copy包,是因为copy是Python标准库的一部分,不需要额外安装,第三方包列表里不会显示它。
正确解决方案
要处理CSV数据并进行复制操作,需先把迭代器转成列表(迭代器只能遍历一次,转成列表后可反复操作),再执行复制或修改:
修改后的代码
import csv count1 = 0 category = [] # 原代码未定义,补充变量初始化 countlist = [] # 原代码未定义,补充变量初始化 with open('C:\\data\\LEARNING\\PHYTON\\excel\\MySQL\\texperts\\supplier.csv', 'r') as csv_data: # 将csv迭代器转为列表,保存所有行数据 csv_rows = list(csv.reader(csv_data, delimiter=',')) # 复制列表(三种方式任选其一) csv_rows_copy = csv_rows.copy() # 列表自带的copy方法 # 或者 csv_rows_copy = copy.copy(csv_rows) # 此时copy模块会被用到,灰色标记消失 # 或者 csv_rows_copy = csv_rows[:] # 切片语法复制列表 # 定义要添加的行(原代码未定义row1,补充定义) row1 = ["new_item1", "new_item2"] csv_rows_copy.append(row1) print(category) print(countlist) # with语句会自动关闭文件,无需手动调用csv_data.close()
关键说明
- 迭代器特性:
csv.reader生成的迭代器只能被遍历一次,遍历后就会耗尽,转成列表可永久保存所有行数据。 - 列表复制的三种常用方式:
- 列表自带的
copy()方法 copy.copy()(浅复制,适用于普通列表)- 切片语法
list[:]
- 列表自带的
内容的提问来源于stack exchange,提问作者Paul Babin
相关产品推荐
相关产品推荐

