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
相关产品推荐
相关产品推荐

