自动获取Windows壁纸

好久不见,我是小困难。自从换了新电脑后,有选择困难症的我一直懒得去换壁纸,就用的是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)


这里也有打包好的文件

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值