Python按条件移动文件问题:符合行数要求的文件无法移动
问题分析与修正方案
代码无法运行的核心错误
字符串路径不能直接调用
glob方法
你定义的src是普通字符串(比如'path1'),但.glob()是pathlib.Path对象的专属方法,直接用字符串调用会触发AttributeError: 'str' object has no attribute 'glob'报错。shutil.move参数完全错误shutil.move()的第一个参数必须是要移动的单个文件路径,你写的shutil.move(src, ...)是把整个源文件夹往目标路径移,完全违背需求,正确的参数应该是遍历到的CSV文件(比如files变量)。第二个版本的行数判断逻辑彻底失效
第二个代码里的len(files)是计算路径字符串的长度(比如'path1/test.csv'的长度是14),和文件实际行数毫无关系,完全偏离了判断条件。
修正后的可运行代码
方式1:使用pathlib(推荐,更简洁)
from pathlib import Path import pandas as pd import shutil # 转为Path对象,支持glob等路径操作 src = Path('path1') dest = Path('path2') # 确保目标文件夹存在,不存在则自动创建 dest.mkdir(exist_ok=True) for csv_file in src.glob('*.csv'): try: # 读取CSV并判断数据行数 df = pd.read_csv(csv_file) if len(df) >= 100: # 移动文件:源文件路径 → 目标文件夹+文件名 shutil.move(str(csv_file), str(dest / csv_file.name)) # 同一磁盘下用rename更高效:csv_file.rename(dest / csv_file.name) except Exception as e: print(f"处理文件 {csv_file.name} 出错: {str(e)}")
方式2:使用os模块(适合新手理解基础路径操作)
import os import pandas as pd import shutil src = 'path1' dest = 'path2' # 确保目标文件夹存在 if not os.path.exists(dest): os.makedirs(dest) for filename in os.listdir(src): if filename.endswith('.csv'): file_path = os.path.join(src, filename) try: df = pd.read_csv(file_path) if len(df) >= 100: shutil.move(file_path, os.path.join(dest, filename)) except Exception as e: print(f"处理文件 {filename} 出错: {str(e)}")
额外优化建议
如果只是判断文件行数,不用pandas会更高效(避免加载整个文件到内存),适合大文件:
# 统计文件总行数(含表头) def count_file_lines(file_path): with open(file_path, 'r', encoding='utf-8') as f: return sum(1 for line in f) # 使用时替换pandas读取部分: line_count = count_file_lines(file_path) # 如果CSV有表头,需要减1(比如表头占1行,数据行≥100则line_count-1≥100) if line_count - 1 >= 100: shutil.move(file_path, os.path.join(dest, filename))
关于降赞的说明
Stack Overflow社区更看重提问的精准性:你只说“无法成功移动文件”,但没提供具体报错信息(比如是语法错误还是逻辑错误)、Python版本、库版本等关键信息,别人很难快速定位问题。下次提问时附上报错内容、运行环境,会更容易获得有效帮助,也能避免不必要的降赞。
内容的提问来源于stack exchange,提问作者solo1111
相关产品推荐
相关产品推荐

