如何从格式不固定的CSV文件中按标题提取指定数据段?
动态定位并读取CSV中的Activities和Sleep区块
针对你这种CSV格式不固定、目标区块位置随机的情况,核心思路是逐行扫描文件,通过标题关键词定位区块起始,再通过空行或其他区块标题判断结束,下面用Python给出具体实现方案:
1. 单文件提取目标区块
写一个函数,遍历CSV的每一行,识别目标标题并收集对应数据,自动跳过空行和无效数据:
import csv def get_target_sections(csv_file, target_names=["Activities", "Sleep"]): # 初始化结果字典,每个目标区块对应一个空列表 section_data = {name: [] for name in target_names} current_section = None # 标记当前是否处于目标区块中 with open(csv_file, 'r', encoding='utf-8') as f: csv_reader = csv.reader(f) for row in csv_reader: # 清理行内的空白内容,方便判断 cleaned_cells = [cell.strip() for cell in row if cell.strip()] if not cleaned_cells: # 遇到空行,结束当前目标区块 current_section = None continue # 检查当前行是否是目标区块的标题 row_content = ' '.join(cleaned_cells).lower() for target in target_names: if target.lower() in row_content: current_section = target break # 找到匹配标题后跳出循环 # 如果处于目标区块,且当前行不是标题行,就收集数据 if current_section and not any(t.lower() in row_content for t in target_names): # 过滤完全空的数据行 if any(cell.strip() for cell in row): section_data[current_section].append(row) # 移除没有数据的区块(比如只有标题没内容的情况) return {k: v for k, v in section_data.items() if v}
2. 批量处理所有CSV文件
结合os模块遍历文件夹下的所有CSV,一次性处理:
import os def batch_process_csv(folder_path): all_results = {} for file_name in os.listdir(folder_path): if file_name.endswith('.csv'): full_path = os.path.join(folder_path, file_name) extracted = get_target_sections(full_path) if extracted: all_results[file_name] = extracted else: print(f"⚠️ {file_name} 里没找到有效Activities/Sleep数据") return all_results # 调用示例,替换成你的CSV文件夹路径 # all_data = batch_process_csv("/Users/xxx/csv_files")
3. 特殊情况处理
- 没有目标标题:函数返回的结果里不会包含对应区块,后续可以直接忽略这类文件。
- 有标题但无数据:函数会自动移除空列表的条目,避免无效数据干扰。
- 格式混乱的行:通过清理空白单元格的逻辑,只保留有实际内容的行。
进阶优化(可选)
如果需要更灵活的标题匹配,可以用正则表达式;如果要做数据分析,把提取的列表转成pandas DataFrame更方便:
import pandas as pd # 假设已经提取了Activities数据 activities_rows = get_target_sections("sample.csv")["Activities"] df_activities = pd.DataFrame(activities_rows)
内容的提问来源于stack exchange,提问作者m45ha
相关产品推荐
相关产品推荐

