Pandas调用to_csv时报IOError: No such file or directory问题求助
问题根本原因
- 核心问题1:文件名包含非法路径字符:你直接将爬取到的
name变量作为CSV文件名,第二页的name值中包含路径分隔符/(从报错路径./Tennis\El Allami F-Z./Mecchi C. - Perrin C./Shrivastava A.csv可看出),操作系统会将/识别为层级路径分隔符,尝试进入不存在的子目录,最终抛出路径不存在错误。第一页的10个链接对应的name没有这类特殊字符,因此可以正常写入。 - 核心问题2:
exist_ok参数报错是因为你使用的Python版本低于3.5,pathlib.Path.mkdir的exist_ok参数从Python3.5版本才正式支持,低版本调用就会提示未知参数。
解决方法
步骤1:清理文件名的非法字符
首先将name变量中所有不允许作为文件名的特殊字符全部替换为下划线,避免被系统识别为路径:
# 替换所有非法文件名字符为下划线 invalid_chars = '<>:"/\\|?*' clean_name = name for c in invalid_chars: clean_name = clean_name.replace(c, '_') fullname = f'{clean_name}.csv'
步骤2:修复路径创建逻辑
方案1:继续使用原有os模块写法
无需修改太多原有逻辑,加上文件名清理即可:
import os import pandas as pd # 前面爬虫获取df、name、date、result的逻辑保持不变 invalid_chars = '<>:"/\\|?*' clean_name = name for c in invalid_chars: clean_name = clean_name.replace(c, '_') fullname = f'{clean_name}.csv' outdir = './Tennis' if not os.path.exists(outdir): os.mkdir(outdir) fullname = os.path.join(outdir, fullname) df.to_csv(fullname, index=False)
方案2:使用pathlib兼容低版本Python
如果Python版本低于3.5,去掉exist_ok参数,手动判断目录是否存在即可:
from pathlib import Path invalid_chars = '<>:"/\\|?*' clean_name = name for c in invalid_chars: clean_name = clean_name.replace(c, '_') output_file = f'{clean_name}.csv' output_dir = Path('./Tennis') if not output_dir.exists(): output_dir.mkdir(parents=True) df.to_csv(output_dir / output_file, index=False)
方案3:Python版本>=3.5的最优写法
保留exist_ok=True参数,目录已存在时不会抛出报错,更适合爬虫循环写入的场景:
from pathlib import Path invalid_chars = '<>:"/\\|?*' clean_name = name for c in invalid_chars: clean_name = clean_name.replace(c, '_') output_file = f'{clean_name}.csv' output_dir = Path('./Tennis') output_dir.mkdir(parents=True, exist_ok=True) df.to_csv(output_dir / output_file, index=False)
内容的提问来源于stack exchange,提问作者Abhishek Rai
相关产品推荐
相关产品推荐

