好久不见,我是小困难。自从换了新电脑后,有选择困难症的我一直懒得去换壁纸,就用的是Windows默认的壁纸,而且现在每天都会自动更换。有的壁纸看起来还不错,但我想保存下来却没有办法。今天突然心血来潮去查了一下方法,干脆就写了一个小程序自动去获取,主要就是一些文件方面的操作,没什么难点。最后会将壁纸保存在桌面上的'壁纸图片/图片'
文件夹中。
import os
import shutil
import datetime
import glob
import time
from collections import OrderedDict
# 最大文件名保存数
MAX_RECORDS = 100
def load_filenames(filename_store_path):
# 加载已复制的文件名和时间戳
filenames = OrderedDict()
if os.path.exists(filename_store_path):
with open(filename_store_path, 'r') as f:
for line in f:
filename, timestamp = line.strip().split(',')
filenames[filename] = float(timestamp)
return filenames
def save_filenames(filenames, filename_store_path):
# 保存文件名和时间戳到txt文件
with open(filename_store_path, 'w') as f:
for filename, timestamp in filenames.items():
f.write(f"{filename},{timestamp}\n")
def copy_if_not_exists(source_dir, dest_dir, filename, filename_store_path):
"""
检查文件是否被拷贝过,没有的话才拷贝
:param source_dir: 原始文件夹
:param dest_dir: 目标文件夹
:param filename: 文件名
:param filename_store_path: 文件名保存地址
:return:
"""
# 检查文件名是否已存在
filenames = load_filenames(filename_store_path)
if filename not in filenames:
# 复制文件
src_file = os.path.join(source_dir, filename)
dst_file = os.path.join(dest_dir, filename)
if os.path.exists(src_file):
# os.copy(src_file, dst_path)
shutil.copy2(src_file, dst_file)
# 添加新文件名和当前时间戳
filenames[filename] = time.time()
# 如果超过100条记录,删除最旧的一条
if len(filenames) > MAX_RECORDS:
filenames.popitem(last=False)
save_filenames(filenames, filename_store_path)
def copy_files_from_dir_to_dir(src_dir, dst_dir, filename_store_path):
"""
复制文件
:param src_dir: 原文件夹
:param dst_dir: 目标文件夹
:param filename_store_path: 文件名保存地址
:return:
"""
# 确保目标目录存在
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
# 遍历源目录中的所有文件
for filename in os.listdir(src_dir):
copy_if_not_exists(src_dir, dst_dir, filename, filename_store_path)
def rename_files_in_dir(directory):
"""
重命名文件,转变文件格式
:param directory: 目标文件夹
:return:
"""
# 获取当前日期
today = datetime.date.today().strftime('%Y%m%d')
# 初始化索引
i = 1
# 遍历目录中的文件
for filename in os.listdir(directory):
# 构造新的文件名
new_filename = f'{today}_{i:03d}.png' # 使用三位数的索引,并保留原文件扩展名
src_file = os.path.join(directory, filename)
dst_file = os.path.join(directory, new_filename)
# 获取文件的扩展名
_, ext = os.path.splitext(src_file)
if os.path.isfile(src_file) and ext.lower() != '.txt':
# 重命名文件
os.rename(src_file, dst_file)
print(f'Renamed "{filename}" to "{new_filename}"')
i += 1
def move_files_from_dir_to_dir(src_dir, dst_dir):
"""
移动文件,不是复制
:param src_dir:原文件夹
:param dst_dir:目标文件夹
:return:
"""
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
for filename in os.listdir(src_dir):
src_file = os.path.join(src_dir, filename)
dst_file = os.path.join(dst_dir, filename)
# 获取文件的扩展名
_, ext = os.path.splitext(src_file)
if os.path.isfile(src_file) and ext.lower() == '.png':
# 使用shutil.move移动文件
shutil.move(src_file, dst_file)
print(f'Moved "{src_file}" to "{dst_file}"')
def setup_wallpaper_folders():
"""
设置图片的保存文件夹
:return: 在桌面上创建文件夹
"""
desktop_path = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop') # 获取桌面路径(Windows)
# 在Linux上可能是 os.path.join(os.path.expanduser('~'), 'Desktop')
# 壁纸图片文件夹路径
wallpaper_folder = os.path.join(desktop_path, '壁纸图片')
# 检查壁纸图片文件夹是否存在,如果不存在则创建
if not os.path.exists(wallpaper_folder):
os.makedirs(wallpaper_folder)
print(f"Created directory: {wallpaper_folder}")
# 检查并创建图片文件夹
image_folder = os.path.join(wallpaper_folder, '图片')
if not os.path.exists(image_folder):
os.makedirs(image_folder)
print(f"Created directory: {image_folder}")
# 检查并创建临时文件夹
temp_folder = os.path.join(wallpaper_folder, '临时文件夹')
if not os.path.exists(temp_folder):
os.makedirs(temp_folder)
print(f"Created directory: {temp_folder}")
return image_folder, temp_folder
def get_init_folder():
"""
获取Windows壁纸保存的文件夹
:return: 文件夹地址
"""
# 设定搜索的起始目录
base_dir = os.path.join(os.path.expanduser('~'), 'AppData', 'Local', 'Packages')
# 使用glob模块来搜索所有以特定前缀开头的文件夹
# 注意:'*' 是一个通配符,代表任意数量的任意字符
pattern = os.path.join(base_dir, 'Microsoft.Windows.ContentDeliveryManager_*')
folders = glob.glob(pattern)
# 遍历找到的文件夹
for folder in folders:
local_state_path = os.path.join(folder, 'LocalState', 'Assets')
if os.path.exists(local_state_path):
print(f"Found 'Assets' folder at: {local_state_path}")
return local_state_path
else:
print(f"The 'Assets' folder does not exist in {folder}")
if __name__ == '__main__':
src_dir = get_init_folder() # 获取Windows壁纸保存的文件夹地址
img_dir, temp_dir = setup_wallpaper_folders() # 初始化壁纸保存地址
filenames_path = os.path.join(temp_dir, 'copied_filenames.txt')
copy_files_from_dir_to_dir(src_dir, temp_dir, filenames_path) # 拷贝原始壁纸文件
rename_files_in_dir(temp_dir) # 修改文件名
move_files_from_dir_to_dir(temp_dir, img_dir)
os.startfile(img_dir)
这里也有打包好的文件