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

Python从外部文件读取文件名变量实现批量复制的问题与解决

问题:Python读取外部文件名清单批量复制文件语法错误排查

错误原因

报错的核心是字符串格式化的语法完全错误,同时存在未处理换行符的问题,具体问题点如下:

  • 引号嵌套错误、格式化占位符位置错误:原代码中r"folder_1/"%s","folder_2/"%s"的写法提前闭合了字符串双引号,%s占位符被放在了字符串外面,同时格式化操作符%被写到了shutil.copy()函数的外部,完全不符合Python字符串格式化的语法规则,直接触发SyntaxError。
  • 未清理行尾换行符:readlines()读取的每一行默认携带末尾的\n换行符,直接拼接路径会指向不存在的文件,就算语法修好了也会报文件不存在的错误。
  • 无效冗余导入:导入的os、os.path模块全程没有使用,属于冗余代码。

可行实现代码

基础实现

import shutil

def main():
    cleanlist =[]
    f = open("file-list.txt", "r")
    if f.mode == 'r':
        flist = f.readlines()
        for element in flist:
            cleanlist.append(element.rstrip())
        for x in cleanlist:
            shutil.copy(f"folder_1/{x}",f"folder_2/{x}")    
            
if __name__ == "__main__":
    main()

该实现用f-string完成路径拼接,提前用rstrip()清理了每一行的换行符,语法完全合法。

优化实现(推荐)

使用with上下文管理器自动管理文件句柄,不需要手动判断文件模式、也不会忘记关闭文件,同时新增空行跳过逻辑,避免清单里的空行导致复制报错:

import shutil

def main():
    # 上下文管理器自动处理文件打开/关闭
    with open("file-list.txt", "r", encoding="utf-8") as f:
        # 逐行读取不需要一次性加载所有内容到大内存,适配超大文件清单
        for line in f:
            filename = line.rstrip()
            # 跳过空行
            if not filename:
                continue
            shutil.copy(f"folder_1/{filename}", f"folder_2/{filename}")

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:09:03