Python项目如何修改下载文件存放路径 解决移动到桌面报错WinError31/32问题
错误原因与解决方案
错误触发根源
- WinError 32:目标音乐文件正被其他进程占用,
wget下载完成后未及时释放文件句柄,或是本地杀毒软件、媒体预览程序正在扫描刚下载的文件,都会触发该类报错 - WinError 31:
os.rename()不支持跨磁盘分区移动文件,如果你的项目存放目录和桌面不在同一个盘符(比如项目在D盘、桌面默认归属C盘),就会触发该错误 - 原有代码存在逻辑漏洞:
wget.download()返回的是字符串类型的文件名,原有判断filename != []永远为真,即便下载失败也会强制执行移动操作,进一步提升了报错概率
修复方案
- 替换移动文件API:用
shutil.move()替代os.rename(),前者原生支持跨盘符移动,兼容性更强 - 增加文件句柄释放等待逻辑:下载完成后增加短暂延迟,避免
wget还未释放文件就执行移动操作 - 修正移动逻辑判断:只有确认下载完成、源文件存在的情况下才执行移动操作
修复后完整代码
import wget, os, requests, webbrowser, shutil, time def visitWeb(myLink): url = myLink webbrowser.register('firefox',None,webbrowser.BackgroundBrowser(myFireFoxDirecoty)) webbrowser.get('firefox').open(url) callMe = input('insert a link :') r = requests.get(callMe) visitWeb(callMe) filename = "" if r.status_code == 200: print('url is ok') url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3' filename = wget.download(url) # 等待1秒确保文件句柄释放 time.sleep(1) # 确认文件存在再执行移动 if filename and os.path.exists(source): shutil.move(source, desktop) print('finished downloading')
注:代码中
myFireFoxDirecoty、source、desktop为路径占位符,请替换为你本地的实际路径。
内容的提问来源于stack exchange,提问作者user16858520
相关产品推荐
相关产品推荐

