pandas.read_csv如何跳过行直到匹配指定字符串 类似R fread的skip参数功能
Python中实现类似R fread按字符串匹配跳过行读取csv/tsv的方案
pandas 原生的read_csv/read_table接口没有直接支持向skip参数传入字符串的功能,不过可以通过少量自定义代码实现完全等效的效果,灵活性甚至更高。
基础实现思路
- 先以文本模式打开目标文件,逐行遍历匹配指定的表头子串,记录需要跳过的行数
- 将计算得到的跳过行数传给
pandas.read_csv的skiprows参数,pandas会自动将匹配到的行作为表头读取
示例代码如下:
import pandas as pd # 配置参数:要匹配的表头子串、文件路径 header_keyword = "user_id" file_path = "test.csv" # 计算需要跳过的行数 skip_num = 0 with open(file_path, "r", encoding="utf-8") as f: for line in f: if header_keyword in line: break skip_num += 1 # 读取文件,支持传入所有pandas原生的read_csv参数 df = pd.read_csv(file_path, skiprows=skip_num, sep=",")
封装为可复用工具函数
如果经常用到这个功能,可以封装为自定义函数,调用起来和R的fread一样方便:
import pandas as pd def read_csv_match_header(file_path: str, header_substr: str, **kwargs): """ 读取csv/tsv文件,自动跳过所有行直到找到包含指定子串的表头行 :param file_path: 文件路径 :param header_substr: 要匹配的表头子字符串 :param kwargs: 其他要传给pandas.read_csv的参数,比如sep、encoding等 """ skip_rows = 0 with open(file_path, "r", encoding=kwargs.get("encoding", "utf-8")) as f: for line in f: if header_substr in line: break skip_rows += 1 return pd.read_csv(file_path, skiprows=skip_rows, **kwargs) # 调用示例:读取tsv文件,找到包含sample_id的行作为表头 df = read_csv_match_header("data.tsv", "sample_id", sep="\t", encoding="gbk")
自定义拓展
你可以根据自己的需求修改匹配逻辑,比如:
- 匹配完整表头:把判断条件改为
if line.strip() == 完整表头字符串 - 匹配多个关键词:把判断条件改为
if all(key in line for key in [关键词列表]) - 匹配到指定字符串后再多跳过N行:给
skip_rows加上对应的数值即可
内容的提问来源于stack exchange,提问作者nhaus
相关产品推荐
相关产品推荐

