如何使用Pandas仅读取CSV文件中的指定行?
用Pandas读取指定行索引对应的行的更优方法
嘿,我懂你现在的困扰——直接用~line_nos行不通,毕竟普通列表不支持这个运算符。其实Pandas本身就有更简洁高效的原生方案,不用自己写列表推导式再转DataFrame,下面给你分享几个实用方法:
方法1:用skiprows配合lambda函数(推荐,适配大文件)
skiprows参数除了接受列表,还能传入一个判断函数:对每一行的索引x,返回True就跳过该行,返回False就保留。我们刚好可以利用这个特性,直接判断行索引是否在你要保留的列表里:
import pandas as pd # 假设你要保留的行索引是这些(从0开始计数,包含表头行) target_lines = [0, 3, 5, 7] df = pd.read_csv("your_file.csv", skiprows=lambda x: x not in target_lines)
这个方法的核心优势是不需要提前把整个文件读进内存,Pandas会在读取过程中实时过滤,非常适合处理大型CSV文件,内存占用更低。
方法2:生成要跳过的行索引列表(适合小文件)
如果你的文件不大,可以先生成所有需要跳过的行索引,再传给skiprows:
import pandas as pd target_lines = {0, 3, 5, 7} # 用集合做判断速度更快 # 先获取文件总行数 total_lines = sum(1 for _ in open("your_file.csv")) # 生成所有不在目标列表里的行索引 skip_list = [i for i in range(total_lines) if i not in target_lines] df = pd.read_csv("your_file.csv", skiprows=skip_list)
这里把目标行存在集合里,是因为集合的in操作比列表快很多,尤其是当目标行数量较多时。
注意:表头行的索引问题
如果你的CSV文件有表头,要注意行索引的计数逻辑:默认情况下,pd.read_csv会把第一行(索引0)当作表头,如果你要保留的是数据行,记得把目标行的索引往后偏移1。比如你要保留第2、4条数据(从1开始数),对应的索引就是[1,3]。
和你当前方法的对比
你现在用的列表推导式方法,需要先把整个文件的内容全部读进内存再筛选,当文件很大时,内存压力会非常大。而上面的Pandas原生方法是在读取阶段就跳过不需要的行,效率更高,代码也更简洁。
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

