Python爬虫中拼接文件名传入open()引发FileNotFoundError的咨询
嘿,我来帮你捋捋这个问题!你遇到的FileNotFoundError不一定是参数类型的问题——虽然你确认了文件名是字符串,但大概率是文件名包含非法字符、目标路径不存在或者权限限制导致的。先给你拆解open()函数调用时的关键参数,再帮你排查常见坑:
一、open()函数的核心必填参数
调用open()时,有两个核心参数是必须明确的:
- 文件名(file):
这是你拼接的字符串,但得注意几个细节:- 如果用相对路径(比如直接写文件名),Python会在当前工作目录下创建/写入文件。你可以先通过
os.getcwd()打印当前工作目录,确认是不是你预期的路径! - 文件名不能包含操作系统的非法字符:Windows下是
\/:*?"<>|,Linux/macOS下是/。比如如果你的date变量里包含/(像2024/05/20),直接拼接成文件名就会触发错误。
- 如果用相对路径(比如直接写文件名),Python会在当前工作目录下创建/写入文件。你可以先通过
- 模式(mode):
因为你要保存的是zip二进制文件,必须用"wb"模式(写入二进制)!如果误用了"w"(文本模式),不仅会导致文件内容损坏,还可能因为编码问题触发异常。
二、针对你的爬虫场景的排查&修复步骤
先打印并校验拼接后的文件名
加一行代码输出最终文件名,检查是否有非法字符或路径问题:date = "2024-05-20" hof = "hof_example" az = "az_example" filename = f"{date}_{hof}_{az}.zip" print(f"待保存文件名:{filename}") # 直接看输出是否合法如果发现有非法字符,提前替换掉:
invalid_chars = '<>:"/\\|?*' for char in invalid_chars: filename = filename.replace(char, '_')确认当前工作目录的可写权限
导入os模块,打印当前路径:import os print(f"当前工作目录:{os.getcwd()}")如果这个目录是系统保护路径(比如Windows的
C:\Program Files),Python可能没有写入权限,换个普通目录(比如D:\downloads)或者用绝对路径拼接文件名:save_dir = "./downloads" # 先创建目录(如果不存在) os.makedirs(save_dir, exist_ok=True) filename = os.path.join(save_dir, f"{date}_{hof}_{az}.zip")正确的文件写入示例(针对zip下载)
别忘了你的ziplink要加上https://前缀,否则请求会失败!完整的下载&保存代码参考:import requests import os # 拼接并处理文件名 date = "2024-05-20" hof = "hof_value" az = "az_value" filename = f"{date}_{hof}_{az}.zip" invalid_chars = '<>:"/\\|?*' for char in invalid_chars: filename = filename.replace(char, '_') # 下载文件 ziplink = "www.file.io/xyzfile.zip" response = requests.get(f"https://{ziplink}", stream=True) response.raise_for_status() # 检查请求是否成功 # 写入文件 with open(filename, "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk)
内容的提问来源于stack exchange,提问作者user1420492
相关产品推荐
相关产品推荐

