3

Python で非常に大きな csv (big = 数十ギガバイト) ファイルを解析していますが、すべての行の最初の列の値だけが必要です。私はこのコードを書き、それを行うためのより良い方法があるかどうか疑問に思いました:

delimiter = ','
f = open('big.csv','r')
for line in f:
    pos = line.find(delimiter)
    id = int(line[0:pos])

最初の区切り文字の前の文字列の部分を取得するより効果的な方法はありますか?

編集: CSV モジュールについては知っています (そして時々使用しました) が、このファイルのすべての行をメモリにロードする必要はありません - 最初の列が必要です。それでは、文字列の解析に焦点を当てましょう。

4

3 に答える 3

4
>>> a = '123456'
>>> print a.split('2', 1)[0]
1
>>> print a.split('4', 1)[0]
123
>>> 

ただし、CSV ファイルを扱っている場合は、次のようになります。

import csv
with open('some.csv') as fin:
    for row in csv.reader(fin):
        print int(row[0])

そしてcsvモジュールは、引用符などを含む引用された列を処理します...

于 2012-12-04T14:54:49.217 に答える
1

最初のフィールドが整数で、どのフィールドにも改行が埋め込まれていない場合など、最初のフィールドにエスケープされた区切り文字を含めることができない場合、つまり、各行がファイル内の正確に1つの物理行に対応する場合、csvモジュールはやり過ぎで、質問から、または@Jon Clements によって提案されline.split(',', 1)たコードを使用できます。

デリミタがない時折の行を処理するには、次を使用できますstr.partition

with open('big.csv', 'rb') as file:
    for line in file:
       first, sep, rest = line.partition(b',')
       if sep: # the line has ',' in it
          process_id(int(first)) # or `yield int(first)`

注:s.split(',', 1)[0]文字列に区切り文字がない場合、暗黙のうちに間違った結果 (文字列全体) が返されます。

'rb'file モードは、不要な行末操作 (および Python 3 での Unicode への暗黙的なデコード) を避けるために使用されます。csv ファイルが'\n'各 raw の末尾にある場合、使用しても安全です。つまり、改行が'\n'または'\r\n'

于 2012-12-04T16:05:56.717 に答える
0

個人的には、ジェネレーターを使用します。

from itertools import imap
import csv

def int_of_0(x):
    return(int(x[0]))

def obtain(filepath, treat):
    with open(filepath,'rb') as f:
        for i in imap(treat,csv.reader(f)):
            yield i

for x in obtain('essai.txt', int_of_0):
    # instructions
于 2012-12-04T16:04:14.090 に答える