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

