Python调用Unsplash API做壁纸脚本,多次下载文件名自动加(1)后缀是为何?
问题根源
文件名自动追加(1)序号是wget库的默认机制导致的:当指定的保存路径已存在同名文件时,wget不会主动覆盖旧文件,会自动在文件名后加序号规避冲突,进而出现每次下载都会生成新的带后缀文件名的情况。
修复方案
只需在每次下载新壁纸前,删除已存在的旧壁纸文件即可,同时可以补充tmp目录不存在的兼容逻辑,避免首次运行报错,修改后的完整代码如下:
# 导入依赖 import os import requests import wget import ctypes import time from config import UNSPLASH_ACCESS_KEY def get_wallpaper(): # 先判断tmp目录是否存在,不存在则创建 if not os.path.exists('tmp'): os.mkdir('tmp') # 先删除已存在的旧壁纸,避免wget自动重命名 save_path = 'tmp/wallpaper.jpg' if os.path.exists(save_path): os.remove(save_path) # 构造API请求参数 url = 'https://api.unsplash.com/photos/random?client_id=' + UNSPLASH_ACCESS_KEY params = { "query": "HD Wallpapers", "orientation": "landscape" } # 发送请求,获取图片直链 response = requests.get(url, params=params).json() image_url = response['urls']['full'] # 下载图片到指定路径 image = wget.download(image_url, save_path) return image def change_wallpaper(): get_wallpaper() # 用os.path.join拼接路径,避免不同系统路径分隔符不兼容问题 path = os.path.join(os.getcwd(), 'tmp', 'wallpaper.jpg') ctypes.windll.user32.SystemParametersInfoW(20, 0, path, 3) def main(): try: while True: change_wallpaper() # 测试可以用10秒,实际使用建议改成3600秒(1小时)换一次 time.sleep(10) except KeyboardInterrupt: print("\n感谢使用,再见!") except Exception as e: print(f"运行出错:{e}") if __name__ == "__main__": main()
可选优化方案
如果不想依赖wget库,也可以直接用requests把图片内容写入指定文件,逻辑更可控,也不会出现自动重命名的问题,替换get_wallpaper里的下载逻辑即可:
# 替换原有wget.download的部分 img_resp = requests.get(image_url) with open(save_path, 'wb') as f: f.write(img_resp.content)
内容的提问来源于stack exchange,提问作者Cameron Farquhar
相关产品推荐
相关产品推荐

