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

基于CSV批量复制JPG图片报错:iterator should return strings, not bytes

解决CSV批量复制图片时的"iterator should return strings, not bytes"错误

问题场景

我有一个CSV文件,第一列存储图片的源路径,第二列存储目标路径。单张图片复制的代码可以正常运行:

import shutil
source_folder = r"C:/Users/JJ/Desktop/test/images/AoF06978.jpg"
destination_folder = r"C:/Users/JJ/Desktop/new_db/test_fire/AoF06978.jpg"
shutil.copyfile(source_folder, destination_folder)

但用以下代码批量复制时,报错iterator should return strings, not bytes:

import csv, shutil

filename = 'C:/Users/JJ/Desktop/test.csv'

with open(filename, 'r') as csvfile:
    datareader = csv.reader(csvfile)
    for row in datareader:
        a= row[0]
        b =row[1]
        shutil.copyfile(a, b)

报错原因

这个错误大多是因为CSV文件的编码与Python默认读取编码不匹配,导致csv.reader读取到字节数据而非字符串。比如Windows下保存的CSV常为GBK编码或带BOM的UTF-8编码,而Python默认用UTF-8读取,就会出现编码冲突。

解决方法

方法1:指定文件编码

直接指定适配的编码打开文件,比如处理带BOM的UTF-8文件用utf-8-sig,Windows本地编码用gbk:

import csv, shutil

filename = 'C:/Users/JJ/Desktop/test.csv'

# 根据实际编码选择,这里以utf-8-sig为例
with open(filename, 'r', encoding='utf-8-sig') as csvfile:
    datareader = csv.reader(csvfile)
    for row in datareader:
        a = row[0]
        b = row[1]
        shutil.copyfile(a, b)

方法2:自动检测文件编码

如果不确定CSV的编码,可借助chardet库检测后再读取:

  1. 先安装chardet:
pip install chardet
  1. 修改代码:
import csv, shutil
import chardet

filename = 'C:/Users/JJ/Desktop/test.csv'

# 检测文件编码
with open(filename, 'rb') as f:
    detect_result = chardet.detect(f.read())

# 使用检测到的编码打开文件
with open(filename, 'r', encoding=detect_result['encoding']) as csvfile:
    datareader = csv.reader(csvfile)
    for row in datareader:
        a = row[0]
        b = row[1]
        shutil.copyfile(a, b)

额外优化:确保目标文件夹存在

如果目标路径的文件夹还未创建,shutil.copyfile会报错,可添加文件夹创建逻辑:

import os
# 在复制前创建目标文件夹(如果不存在)
os.makedirs(os.path.dirname(b), exist_ok=True)
shutil.copyfile(a, b)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:10:11