chunksize不是从csv文件的第一行开始的

时间:2018-01-14 14:36:29

标签: python python-3.x pandas csv dataframe

使用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将始终跳到最后给定的数字,则听不到跳过按预期工作。

对于此处可能会发生的任何建议表示赞赏。

2 个答案:

答案 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   有关iteratorchunksize的更多信息。

答案 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')