You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac下运行读写外接硬盘的Python脚本及同步epub文件夹的方法

在Mac上用Python读写外接硬盘文件及同步EPUB文件方案

一、Python读写外接硬盘中的TXT文件

Mac上外接硬盘默认挂载在/Volumes/目录下,比如你的硬盘名为MyExternalDrive,根路径就是/Volumes/MyExternalDrive/。直接用Python内置文件操作即可,只要硬盘已挂载且Python有读写权限。

示例代码:

# 读取外接硬盘的TXT文件
external_txt_path = "/Volumes/MyExternalDrive/docs/note.txt"
with open(external_txt_path, "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

# 写入内容到外接硬盘的TXT文件
with open(external_txt_path, "a", encoding="utf-8") as f:
    f.write("\n新增的内容")

注意事项:

  • 硬盘名称含空格时,路径要加引号或转义,比如"/Volumes/My External Drive/docs/note.txt"
  • 确保外接硬盘未设为只读模式
  • 读写时指定编码(如utf-8)避免乱码

二、同步外接硬盘EPUB文件到本地下载文件夹

用os处理路径和文件信息,shutil负责复制文件,核心逻辑是:读取文件名列表→遍历外接硬盘EPUB文件夹→对比本地副本修改时间→复制更新后的文件。

完整脚本示例:

import os
import shutil
from datetime import datetime

# 配置路径(根据实际情况修改)
EXTERNAL_DRIVE_PATH = "/Volumes/MyExternalDrive/"
TO_READ_FOLDER = os.path.join(EXTERNAL_DRIVE_PATH, "待读EPUB")
TO_REREAD_FOLDER = os.path.join(EXTERNAL_DRIVE_PATH, "重读EPUB")
TO_READ_LIST = os.path.join(EXTERNAL_DRIVE_PATH, "待读列表.txt")
TO_REREAD_LIST = os.path.join(EXTERNAL_DRIVE_PATH, "重读列表.txt")
LOCAL_DOWNLOAD_PATH = os.path.expanduser("~/Downloads/")

def load_epub_list(file_path):
    """读取EPUB文件名列表"""
    epub_list = []
    if not os.path.exists(file_path):
        print(f"警告:列表文件 {file_path} 不存在")
        return epub_list
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            fname = line.strip()
            if fname.endswith(".epub"):
                epub_list.append(fname)
    return epub_list

def sync_epub_files(source_folder, target_folder, epub_list):
    """同步指定文件夹中的EPUB文件到目标文件夹"""
    if not os.path.exists(source_folder):
        print(f"警告:源文件夹 {source_folder} 不存在")
        return
    
    # 确保目标文件夹存在
    os.makedirs(target_folder, exist_ok=True)
    
    for epub_name in epub_list:
        source_path = os.path.join(source_folder, epub_name)
        target_path = os.path.join(target_folder, epub_name)
        
        # 检查源文件是否存在
        if not os.path.exists(source_path):
            print(f"跳过:源文件 {source_path} 不存在")
            continue
        
        # 判断是否需要复制:目标文件不存在,或源文件更新时间更晚
        need_copy = False
        if not os.path.exists(target_path):
            need_copy = True
        else:
            source_mtime = datetime.fromtimestamp(os.path.getmtime(source_path))
            target_mtime = datetime.fromtimestamp(os.path.getmtime(target_path))
            if source_mtime > target_mtime:
                need_copy = True
        
        if need_copy:
            try:
                # copy2保留文件元数据(如修改时间)
                shutil.copy2(source_path, target_path)
                print(f"已复制:{epub_name}")
            except Exception as e:
                print(f"复制失败 {epub_name}:{str(e)}")

if __name__ == "__main__":
    # 加载文件名列表
    to_read_list = load_epub_list(TO_READ_LIST)
    to_reread_list = load_epub_list(TO_REREAD_LIST)
    
    # 同步待读EPUB
    print("开始同步待读EPUB...")
    sync_epub_files(TO_READ_FOLDER, LOCAL_DOWNLOAD_PATH, to_read_list)
    
    # 同步重读EPUB
    print("\n开始同步重读EPUB...")
    sync_epub_files(TO_REREAD_FOLDER, LOCAL_DOWNLOAD_PATH, to_reread_list)
    
    print("\n同步完成")

关键注意事项:

  • 测试先行:先把shutil.copy2替换成print(f"将复制:{source_path} → {target_path}"),确认路径和文件正确后再执行实际复制
  • 权限检查:确保Python有外接硬盘读写权限和本地下载文件夹写入权限
  • 路径准确性:外接硬盘挂载名称可通过访达或Bash命令ls /Volumes/查看
  • 异常扩展:可根据需求添加重复文件名处理、只读文件跳过等逻辑

三、可选:Bash辅助挂载硬盘

如果需要自动挂载外接硬盘,可在Bash脚本中加入(需管理员权限):

# 替换为你的硬盘UUID和挂载点,先用diskutil list查看设备路径
sudo mount -t apfs /dev/disk2s1 /Volumes/MyExternalDrive

内容的提问来源于stack exchange,提问作者HarlequinTRT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:35:10