6

約 500 GB のテキスト ファイルが数か月に分けられています。これらのテキスト ファイルでは、最初の 43 行は単なる接続情報です (不要)。次の 75 行は、観測の記述子です。これに 4 行 (不要) が続き、次の観測 (75 行) が続きます。

私が欲しいのは、次のように特徴付けられるこれらの 75 行 (記述子はすべての観測に対して同じ場所にあります) だけです。

ID: 5523
Date: 20052012
Mixed: <Null>
.
.

5523;20052012;;..そして、観察ごとにcsv形式に変更したいと思います。そのため、テキストファイルははるかに小さくなります。記述子は同じなので、たとえば最初の位置が ID であることがわかります。

テキスト ファイルが完成したら、次のファイルを開いて追加します (または、新しいファイルを作成する方が速いでしょうか?)。

私がやったことは非常に非効率的です。ファイルを開いています。読み込んでいます。行ごとにこれらの観測を削除します。テストサンプルでかなりの時間がかかる場合、明らかに最良の方法ではありません.

どんな提案も素晴らしいでしょう。

4

3 に答える 3

6

「約 500GB のテキスト ファイル」があるとおっしゃいました。私が正しく理解していれば、観測ごとに固定長はありません(注、行数について話しているのではありません観測のすべての行の合計長(バイト単位)を意味します)。これは、改行がどこにあるかを正確に知ることができないため、ファイル全体を調べなければならないことを意味します。

ここで、個々のテキスト ファイルのサイズに応じて、別の答えを探す必要がある場合があります。しかし、各ファイルが十分に小さい (1 GB 未満?) 場合は、linecache行ごとのシークを処理するモジュールを使用できる可能性があります。

おそらく次のように使用します。

import linecache

filename = 'observations1.txt'

# Start at 44th line
curline = 44
lines = []

# Keep looping until no return string is found
# getline() never throws errors, but returns an empty string ''
# if the line wasn't found (if the line was actually empty, it would have
# returned the newline character '\n')
while linecache.getline(filename, curline):
    for i in xrange(75):
        lines.append(linecache.getline(filename, curline).rstrip())
        curline += 1

    # Perform work with the set of observation lines
    add_to_observation_log(lines)

    # Skip the unnecessary section and reset the lines list
    curline += 4
    lines = []

これをテストしてみたところ、23MB のファイルを 5 秒で消化しました。

于 2012-05-20T19:06:08.487 に答える
2

ファイルを開きます。読み込んでいます。行ごとにこれらの観測を削除します。

「ロードする」とはどういう意味ですか?全体を文字列に読み込むことを意味する場合、はい、これはひどいことです。ファイルを処理する自然な方法は、ファイル オブジェクトがファイルの行に対する反復子であるという事実を利用することです。

for line in file:
    if should_use(line): do_something_with(line)
于 2012-05-20T19:17:48.620 に答える
0

保持したい情報をデータベースに書き込むことを検討する必要があります。Pythonでは、組み込みのsqlite3を使用できます。ドキュメントから理解するのは簡単です

これで、各ファイルの行を正確に保持したいと言います。だからあなたはこのようなことを試すことができます。

    import csv
    reader = csv.reader(open("afile.csv","rb"),delimiter="\t",quotechar='"')
    info_to_keep = []
    obs = []
    for row in reader:
       i+=1
       if i<43:
           continue
       elif i-43 <79*(len(info_to_keep)+1)-4:
           obs.append(row)
       elif i-43 <79*(len(info_to_keep)+1):
           continue
       else:
           info_to_keep.append(obs)
           obs = [row]

このようにして、info_to_keepという名前のリストを作成できます。各エントリには、75個のエントリを含むリストが含まれ、各エントリには、csvファイルのフィールドを含むリストが含まれます。

于 2012-05-20T19:46:17.287 に答える