你想要用 Python 实现读取一个按行存储文件名的 TXT 文件,将每行内容作为目标文件名,然后把这些文件从原位置移动到指定的新位置,我会为你提供一份完整、健壮的实现代码,并详细解释关键步骤。
实现思路
- 读取 TXT 文件:逐行读取 TXT 文件中的内容,清理每行的换行符、空格等无效字符,过滤空行;
- 路径处理:定义文件的源目录(文件原本所在位置)和目标目录(要移动到的位置),自动创建目标目录(避免目录不存在报错);
- 文件移动:遍历读取到的每个文件名,拼接完整的源路径和目标路径,使用
shutil库安全移动文件,并处理文件不存在、权限不足等异常; - 异常处理:针对常见错误(如文件不存在、权限问题、路径错误)给出明确提示,保证程序健壮性。
完整 Python 代码示例
python
import os import shutil def move_files_from_txt(txt_file_path, source_dir, target_dir): """ 从TXT文件读取文件名,将对应文件从源目录移动到目标目录 :param txt_file_path: 存储文件名的TXT文件路径(如:./file_list.txt) :param source_dir: 源文件所在目录(如:./source_files/) :param target_dir: 目标目录(如:./target_files/) """ # 1. 检查TXT文件是否存在 if not os.path.exists(txt_file_path): print(f"错误:TXT文件 {txt_file_path} 不存在!") return # 2. 自动创建目标目录(如果不存在) os.makedirs(target_dir, exist_ok=True) # 3. 读取TXT文件中的文件名(逐行) try: with open(txt_file_path, 'r', encoding='utf-8') as f: # 读取所有行,清理空行和换行符 file_names = [line.strip() for line in f.readlines() if line.strip()] except Exception as e: print(f"读取TXT文件失败:{str(e)}") return # 4. 遍历文件名,移动对应文件 success_count = 0 # 成功移动的文件数 fail_count = 0 # 移动失败的文件数 fail_files = [] # 记录移动失败的文件 for file_name in file_names: # 拼接源文件完整路径和目标文件完整路径 source_file = os.path.join(source_dir, file_name) target_file = os.path.join(target_dir, file_name) # 检查源文件是否存在 if not os.path.exists(source_file): print(f"跳过:文件 {source_file} 不存在!") fail_count += 1 fail_files.append(file_name) continue # 避免目标文件已存在(可选:覆盖/跳过,这里选择跳过) if os.path.exists(target_file): print(f"跳过:目标目录已存在文件 {file_name},不覆盖!") fail_count += 1 fail_files.append(file_name) continue # 移动文件 try: shutil.move(source_file, target_file) print(f"成功:{file_name} 已移动到 {target_dir}") success_count += 1 except PermissionError: print(f"失败:无权限移动 {file_name}(文件可能被占用/权限不足)") fail_count += 1 fail_files.append(file_name) except Exception as e: print(f"失败:移动 {file_name} 出错 - {str(e)}") fail_count += 1 fail_files.append(file_name) # 5. 输出移动结果统计 print("\n===== 移动完成 =====") print(f"总计读取文件名:{len(file_names)} 个") print(f"成功移动:{success_count} 个") print(f"移动失败:{fail_count} 个") if fail_files: print(f"失败文件列表:{fail_files}") # ------------------- 调用示例 ------------------- if __name__ == "__main__": # 请根据你的实际情况修改以下参数 TXT_FILE = "./file_list.txt" # 存储文件名的TXT文件路径 SOURCE_DIR = "./original_files/" # 源文件所在目录 TARGET_DIR = "./moved_files/" # 目标目录(会自动创建) # 调用函数执行文件移动 move_files_from_txt(TXT_FILE, SOURCE_DIR, TARGET_DIR)关键说明
TXT 文件格式要求:
- TXT 文件每行仅写一个文件名(包含扩展名),例如:
plaintext
商品1.jpg 文档2.pdf 视频3.mp4 - 代码会自动过滤空行和行首 / 行尾的空格、换行符,无需手动清理。
- TXT 文件每行仅写一个文件名(包含扩展名),例如:
路径配置注意事项:
TXT_FILE:填写 TXT 文件的完整路径(如D:/list/file_names.txt)或相对路径(如./file_list.txt);SOURCE_DIR/TARGET_DIR:路径结尾建议加/(Windows 系统加\),例如D:/source/、./target/;- Windows 系统路径可使用
\\(转义)或原始字符串(如r"D:\source\file.txt")。
异常处理说明:
- 处理了 “TXT 文件不存在”“源文件不存在”“目标文件已存在”“权限不足” 等常见错误;
- 目标文件已存在时默认跳过,若需要覆盖,可删除
if os.path.exists(target_file):相关代码块。
依赖说明:
- 代码使用 Python 内置库
os和shutil,无需额外安装第三方库,直接运行即可。
- 代码使用 Python 内置库
总结
- 核心逻辑是读取 TXT→清理文件名→拼接路径→移动文件,关键要做好路径处理和异常捕获;
os.makedirs(target_dir, exist_ok=True)可自动创建目标目录,避免目录不存在的报错;shutil.move()是 Python 移动文件的标准方法,支持跨目录、跨磁盘(部分系统)移动,比手动复制删除更安全。
如果需要调整逻辑(比如覆盖目标文件、移动时重命名、读取带路径的文件名),可以告诉我,我会帮你修改代码。