Python 中正确复制 CSV 读取器数据为列表的完整教程

本文详解如何将 csv.reader 对象安全转换并复制为普通 Python 列表,避免误用 dict.copy() 导致的 TypeError,并提供可直接运行的代码示例与关键注意事项。

本文详解如何将 `csv.reader` 对象安全转换并复制为普通 Python 列表,避免误用 `dict.copy()` 导致的 TypeError,并提供可直接运行的代码示例与关键注意事项。

在 Python 中,csv.reader 返回的是一个迭代器对象(_csv.reader),而非字典(dict)或列表(list)。因此,直接调用 dict.copy(csv_reader) 会触发 TypeError——因为 dict.copy() 是类方法,仅适用于字典实例,不能作用于 CSV 迭代器。同样,copy.copy() 或 copy.deepcopy() 虽然可用于大多数对象,但对已耗尽的迭代器无效,且无法“复制”其一次性遍历特性。

正确做法是:先将 csv.reader 迭代器显式转换为列表,再对列表进行复制。列表支持 .copy() 方法(浅拷贝),也兼容 copy.copy() 和切片 [:] 等方式:

import csv

with open(r'C:\data\LEARNING\PHYTON\excel\MySQL\texperts\supplier.csv', 'r', encoding='utf-8') as csv_data:
    csv_reader = csv.reader(csv_data, delimiter=',')
    # ✅ 正确:将迭代器转为列表(一次性读取全部行)
    csv_data_list = list(csv_reader)

    # ✅ 三种等效的复制方式(均生成新列表对象)
    csv_data_list_copy = csv_data_list.copy()           # 推荐:清晰、高效
    # csv_data_list_copy = copy.copy(csv_data_list)     # 需 import copy
    # csv_data_list_copy = csv_data_list[:]             # 简洁,但语义稍弱

# 此时可安全操作副本,例如追加新行
row1 = ['new_id', 'new_name', 'new_email']
csv_data_list_copy.append(row1)

print(f"原始数据行数: {len(csv_data_list)}")
print(f"副本行数: {len(csv_data_list_copy)}")

⚠️ 关键注意事项:

总结:复制 CSV 数据的核心逻辑是「迭代器 → 列表 → 复制列表」,杜绝对非字典对象调用 dict.copy()。掌握这一模式,即可稳健构建多份独立数据副本,用于分类、过滤、写入不同文件等后续操作。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。