Python3分割大CSV时chunksize未从首行开始问题求助
嘿,我来帮你捋清楚这个问题的根源,以及怎么解决它~
问题原因分析
你遇到的两个核心问题其实都是对pandas read_csv的参数逻辑理解偏差导致的:
chunksize返回迭代器,而非直接DataFrame
当你设置chunksize时,pd.read_csv()不会直接返回整个数据集,而是返回一个TextFileReader迭代器。如果直接把这个迭代器拿去存成CSV,它会遍历所有的chunk块,最后只保留并写入最后一个chunk的数据——这就是为什么你第一段代码总是拿到最后500行的原因。skiprows的行为误解
你的CSV应该是带表头的吧?如果设置skiprows=500,pandas会直接跳过文件的前500行(包括第一行的表头),然后把第500行当成新的表头来读取,这显然和你“跳过前500行数据、保留表头”的需求完全不符。
正确的代码实现
第一段:提取前500行数据(含表头)
我们需要手动获取迭代器的第一个chunk,这才是你要的前500行数据:
import pandas as pd # 获取迭代器,chunksize=500表示每个chunk包含500行数据 chunk_iterator = pd.read_csv(r'file.csv', index_col=None, header='infer', encoding='ISO-8859-1', chunksize=500) # 取第一个chunk(前500行数据,列名沿用原表头) first_500_rows = next(chunk_iterator) # 保存到新文件,index=False避免写入默认索引列 first_500_rows.to_csv('first_file.csv', index=False, encoding='ISO-8859-1')
第二段:跳过前500行数据,读取剩余2500行
这里我们要精准跳过表头之后的500行数据,同时保留原表头,用skiprows指定要跳过的行范围,再用nrows限制读取行数:
# 跳过第1到第500行(第0行是表头),读取接下来的2500行 remaining_2500_rows = pd.read_csv( r'file.csv', index_col=None, header='infer', encoding='ISO-8859-1', skiprows=range(1, 501), # 跳过表头后的500行数据 nrows=2500 ) remaining_2500_rows.to_csv('second_file.csv', index=False, encoding='ISO-8859-1')
额外小提示
如果你的CSV没有表头,那skiprows的逻辑要调整:直接用skiprows=500,同时设置header=None,这样就会跳过前500行,读取后续的2500行。
内容的提问来源于stack exchange,提问作者Fra_S
相关产品推荐
相关产品推荐

