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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 08:45:07