Python按文件名移动指定Excel文件及2024年数据筛选问题
问题解决:警方数据文件移动与2024年数据筛选加载
一、文件移动失败的问题修复
问题分析
从运行输出和代码逻辑来看,核心问题有两点:
- 遍历逻辑遗漏文件:原代码通过
os.listdir遍历源目录后,仅对文件夹执行os.walk,但目标CSV文件直接存放在源目录根路径下,被误判为"folder"后因os.path.isdir返回False,完全跳过了文件检查环节。 - 文件名匹配条件不符:原代码判断
file.endswith("street.csv"),但实际目标文件名以stop-and-search.csv结尾,应改为匹配文件名中**包含"street"**的条件。
修正后的代码
import os import shutil def move_street_files(source_dir, dest_dir): # 校验源目录存在性 if not os.path.exists(source_dir): print(f"源目录不存在: {source_dir}") return # 遍历源目录下所有层级的文件 for root, _, files in os.walk(source_dir): for file in files: # 匹配文件名中包含"street"的文件(不区分大小写) if "street" in file.lower(): source_path = os.path.join(root, file) dest_path = os.path.join(dest_dir, file) try: shutil.move(source_path, dest_path) print(f"已移动: {source_path} -> {dest_path}") except Exception as e: print(f"移动失败 {source_path}: {str(e)}") # 路径配置 source_dir = r'C:\Users\Nathan\Documents\Data Science Projects\Police Dataset\Police Dataset\Stop and Search' dest_dir = r'C:\Users\Nathan\Documents\Data Science Projects\Police Dataset\Police Dataset\Street' # 创建目标目录(不存在则自动创建) os.makedirs(dest_dir, exist_ok=True) # 执行移动操作 move_street_files(source_dir, dest_dir) print("操作完成")
关键改进点
- 直接用
os.walk(source_dir)遍历全目录,无需手动区分文件夹与文件,避免遗漏根目录下的目标文件; - 改用
"street" in file.lower()匹配条件,支持不区分大小写且匹配文件名任意位置的"street",适配实际文件名格式; - 移除冗余打印语句,简化输出信息。
二、仅加载2024年数据的方法
从文件名格式(如2021-03-avon-and-somerset-stop-and-search.csv)可知,文件名以YYYY-MM开头,因此可先筛选出以"2024-"开头的文件,再加载到DataFrame,大幅减少加载耗时。
示例代码(基于Pandas)
import os import pandas as pd def load_2024_data(source_dir): df_list = [] # 遍历目标目录下所有文件 for root, _, files in os.walk(source_dir): for file in files: # 筛选2024年的文件 if file.startswith("2024-"): file_path = os.path.join(root, file) try: # 若为Excel文件,替换为pd.read_excel df = pd.read_csv(file_path) df_list.append(df) print(f"已加载: {file_path}") except Exception as e: print(f"加载失败 {file_path}: {str(e)}") # 合并所有2024年数据 if df_list: combined_df = pd.concat(df_list, ignore_index=True) return combined_df else: print("未找到2024年数据文件") return None # 加载2024年数据 source_dir = r'C:\Users\Nathan\Documents\Data Science Projects\Police Dataset\Police Dataset\Street' df_2024 = load_2024_data(source_dir) # 后续分析逻辑 if df_2024 is not None: print(f"2024年数据总行数: {len(df_2024)}") # 你的数据分析代码
额外优化建议
- 若文件为Excel格式,将
pd.read_csv替换为pd.read_excel,并可通过usecols参数指定仅加载所需列,进一步压缩加载时间; - 若文件名年份格式不统一,可通过正则表达式提取年份:
import re year_match = re.search(r'(\d{4})-', file) if year_match and year_match.group(1) == "2024": # 执行加载操作
内容的提问来源于stack exchange,提问作者Thomas Mckillen
相关产品推荐
相关产品推荐

