24

これを行うためのいくつかの方法:

  1. CSV 全体を読み取ってから使用するdf.tail
  2. どういうわけかファイルを逆にして(大きなファイルに対してこれを行う最良の方法は何ですか?)、nrows引数を使用して読み取ります
  3. どういうわけかCSVの行数を見つけてから、skiprows必要な行数を使用して読み取ります。
  4. 多分最初のチャンクを破棄してチャンク読み取りを行うかもしれません(ただし、これがどのように機能するかはわかりません)

もっと簡単な方法でそれを行うことはできますか?そうでない場合、これら 3 つの中でどれを優先する必要がありますか? また、その理由は何ですか?

おそらく関連しています:

  1. テキスト ファイルの最後の行を効率的に見つける
  2. pandas read_csv と nrows を使用して ~13000 行の CSV ファイルの一部を読み取る

直接関係ない:

  1. pandasデータフレームの最後のn行を取得するには?
4

7 に答える 7

33

pandas が でこれを行う方法を提供しているとは思いませんread_csv

おそらく(1回のパスで)最もきちんとしたのは、次を使用することcollections.dequeです:

from collections import deque
from StringIO import StringIO

with open(fname, 'r') as f:
    q = deque(f, 2)  # replace 2 with n (lines read at the end)

In [12]: q
Out[12]: deque(['7,8,9\n', '10,11,12'], maxlen=2)
         # these are the last two lines of my csv

In [13]: pd.read_csv(StringIO(''.join(q)), header=None)

試してみる価値のある別のオプションは、最初のパスで行数を取得してからファイルを再度読み取り、read_csv...を使用してその行数 (マイナス n) をスキップすることです。

于 2013-06-14T13:05:50.053 に答える
7

ファイルは単なるバイト ストリームです。線は個別のエンティティとして存在しません。これらは、特定のバイトを改行文字として扱うためのアーティファクトです。そのため、ファイルの先頭から読み取って、行を順番に識別する必要があります。

ファイルが(頻繁に)変更されず、これが頻繁に実行する必要がある操作である場合(たとえば、 の値が異なる場合n)、改行文字のバイトオフセットを 2 番目のファイルに保存できます。このはるかに小さいファイルとseekコマンドを使用して、最初のファイルの特定の行にすばやくジャンプし、そこから読み取ることができます。

(一部のオペレーティング システムでは、一般的なフラット ファイルよりも内部構造が複雑なレコード指向のファイルが提供されます。これらのファイルには、上記は当てはまりません。)

于 2013-06-14T12:43:34.590 に答える
0

metadata.csv ファイルを作成し、csv の長さを追跡できます。csv に行を追加するたびに、metadata.csv ファイルを最新の row_count で更新します。次回csvをロードするときは、以下を使用してください:

file_size = 139405 #stored in your metadata.csv file
n_bottom_rows = 7
df = pd.read_csv('myfile.csv',skiprows = filesize - n_bottom_rows)
于 2022-01-16T08:17:40.340 に答える