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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:05:21