如何修改Python CSV图片下载代码以支持非英文字符文件名
问题描述
现有Python代码功能为从CSV文件的"link"列读取链接下载图片,并以"title"列内容作为文件名。但遇到非英文字符时程序抛出OSError无法运行,具体错误信息及原代码如下,需修改代码使其支持非英文字符文件名。
原代码
import urllib.request import csv import os with open('booklogo.csv') as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row) if row["link"] != '' and row["title"] != '': name, ext = os.path.splitext(row['link']) if ext == '': ext = ".png" title_filename = f"{row['title']}{ext}".replace('/', '-') urllib.request.urlretrieve(row['link'], title_filename)
错误信息
OSError Input In [5], in <cell line: 5>() 13 ext = ".png" 14 title_filename = f"{row['title']}{ext}".replace('/', '-') ---> 15 urllib.request.urlretrieve(row['link'], title_filename) File ~\anaconda3\lib\urllib\request.py:249, in urlretrieve(url, filename, reporthook, data) 247 # Handle temporary file setup. 248 if filename: ---> 249 tfp = open(filename, 'wb') 250 else: 251 tfp = tempfile.NamedTemporaryFile(delete=False) OSError: [Errno 22] Invalid argument: 'Albert ?eská republika.png'
解决方案
问题根源有两个:一是Windows系统文件名包含非法字符(如?),二是CSV文件读取时编码未指定导致非英文字符乱码。修改后的代码如下:
import urllib.request import csv import os import re # 匹配Windows文件名所有非法字符 invalid_filename_chars = re.compile(r'[\\/:*?"<>|]') # 读取CSV时指定UTF-8编码,避免非英文字符乱码 with open('booklogo.csv', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile) for row in reader: link = row["link"].strip() title = row["title"].strip() if link and title: # 提取文件扩展名,无扩展名则默认用.png _, ext = os.path.splitext(row['link']) ext = ext if ext else ".png" # 清理标题:移除/替换所有非法字符,保留非英文字符 clean_title = invalid_filename_chars.sub('-', title) title_filename = f"{clean_title}{ext}" # 增加异常捕获,单个文件失败不终止程序 try: urllib.request.urlretrieve(link, title_filename) print(f"已成功保存:{title_filename}") except Exception as e: print(f"保存失败 {title_filename}: {str(e)}")
关键修改点
- 指定CSV编码:打开CSV时添加
encoding='utf-8',确保非英文字符读取正常,避免乱码产生非法字符 - 清理非法字符:用正则表达式替换Windows文件名禁止的所有字符(
\ / : * ? " < > |),而非仅替换/ - 空白字符处理:用
strip()去除标题和链接前后的空白,避免文件名出现多余空格 - 异常捕获:添加
try-except块,单个文件下载失败时输出错误信息,程序继续运行
内容的提问来源于stack exchange,提问作者midomid
相关产品推荐
相关产品推荐

