使用Python 3.
我有一个非常大的CSV文件,我需要拆分并保存to_csv。我使用chunksize参数来确定两个文件中需要多少行。 期望是第一个代码应该读取所需的行,因此我可以将其保存到第一个CSV文件中,第二个应该处理剩余的行,以便我可以将它们保存在第二个CSV文件中:
作为一个例子,假设文件是3000行并使用下面的代码:
file = pd.read_csv(r'file.csv',index_col=None, header='infer', encoding='ISO-8859-1',skiprows=None, chunksize=500)
我已经使用了skiprows = None,因为我希望它从头开始并将前500个分块。
然后,第二个代码应该跳过之前的500和剩余的块:
file = pd.read_csv(r'file.csv',index_col=None, header='infer', encoding='ISO-8859-1',skiprows=500, chunksize=2500)
然而,我从第一个代码得到的结果是它总是直接进入最后500个并且不按预期从开始开始。如果chunksize将始终跳到最后给定的数字,则听不到跳过按预期工作。
对于此处可能会发生的任何建议表示赞赏。
答案 0 :(得分:1)
只要您使用chunksize
参数None
的默认值(不是pd.read_csv
),就会返回TextFileReader
迭代器而不是DataFrame。 pd.read_csv()
将尝试以块(具有指定的块大小)读取您的CSV文件:
reader = pd.read_csv(filename, chunksize=N)
for df in reader:
# process df (chunk) here
所以当使用chunksize
时 - 所有块(除了最后一个块)都具有相同的长度。使用iterator
参数,您可以定义每次迭代中要读取的数据量(get_chunk(nrows)
):
In [66]: reader = pd.read_csv(fn, iterator=True)
让我们先阅读3行
In [67]: reader.get_chunk(3)
Out[67]:
a b c
0 2.229657 -1.040086 1.295774
1 0.358098 -1.080557 -0.396338
2 0.731741 -0.690453 0.126648
现在我们将阅读接下来的5行:
In [68]: reader.get_chunk(5)
Out[68]:
a b c
0 -0.009388 -1.549381 0.913128
1 -0.256654 -0.073549 -0.171606
2 0.849934 0.305337 2.360101
3 -1.472184 0.641512 -1.301492
4 -2.302152 0.417787 0.485958
接下来的7行:
In [69]: reader.get_chunk(7)
Out[69]:
a b c
0 0.492314 0.603309 0.890524
1 -0.730400 0.835873 1.313114
2 1.393865 -1.115267 1.194747
3 3.038719 -0.343875 -1.410834
4 -1.510598 0.664154 -0.996762
5 -0.528211 1.269363 0.506728
6 0.043785 -0.786499 -1.073502
来自docs:
迭代器:布尔值,默认为False
返回TextFileReader对象以进行迭代或获取块 get_chunk()。
chunksize :int,默认无
返回
TextFileReader
对象进行迭代。见the IO Tools docs 有关iterator
和chunksize
的更多信息。
答案 1 :(得分:1)
如果我明白你想要做什么,听起来你真的不需要大块头。这里的代码将前500行读入df1,其余行写入df2,然后组合成单个数据帧,以防你想要这样做。
rows = 500
df1 = pd.read_csv( 'test.csv', nrows =rows )
df2 = pd.read_csv( 'test.csv', skiprows=rows+1, names=df1.columns )
df3 = pd.concat( [df1,df2] ).reset_index(drop=True)
如果您只想阅读原始文件并输出2个新的csv文件而不创建任何中间数据帧,那么这可能就是您想要的?
names = pd.read_csv( 'test.csv', nrows = 2 ).columns # store column names
pd.read_csv( 'test.csv', nrows = rows ).to_csv('foo1.csv')
pd.read_csv( 'test.csv', skiprows = rows+1, names=names ).to_csv('foo2.csv')