基于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库检测后再读取:
- 先安装chardet:
pip install chardet
- 修改代码:
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
相关产品推荐
相关产品推荐

