Pythonのcsv.readerが使用されているのを私が見た唯一の方法は、forループです。これは、過去の読み取り値を変数に保存せずにファイル全体を調べます。 (巨大な)ファイルの連続する2行を一度に処理するだけで済みます。 csv.reader forループを使用すると、一度に1行しかありません。
Pythonのcsvモジュールを使用して、CSVファイルの1行だけを取り込んで、ファイルの最後まで読み終える必要がない方法はありますか?
変数を最初の行の値に設定し、2番目の変数セットを次の行の値に設定し、2つの変数セットを同時に計算に使用し、最初の変数セットを2番目のセットで上書きします。新しい行を読み取って、2番目のセットを上書きします。
リーダーをループで使用する必要はありません。最初の行を読んでから、2行目を読んでください。
import csv
rdr = csv.reader(open("data.csv"))
line1 = rdr.next() # in Python 2, or next(rdr) in Python 3
line2 = rdr.next()
常に正確に2つの連続する行を見ている場合、ペアワイズ recipe を使用することで利益が得られるように思えます。 itertools モジュールから:
from itertools import tee, izip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
これは次のように使用します。
for first_dict, second_dict in pairwise(csv.DictReader(stream)):
# do stuff with first_dict and second_dict
CSVを読み取る:
readCSV = csv.reader(csvFile, delimiter=',')
Python 2.7の次の行を読む:
row = readCSV.next()
Python 3.4の次の行を読む:
row = readCSV.__next__()
TKからのあからさまな盗み... ...残る問題は、OPがファイルの最初と最後の行で何をしたいかということです。
prevLine = None
for x in csv.DictReader(stream):
if prevLine is not None:
DoWork(prevLine, x)
else:
Initialize(x)
prevLine = x
Finalize(prevLine)
明白な答えは、各反復で前の行を保存することです。
>>> for x in csv.DictReader(stream):
... print prevLine
... print x
... prevLine = x
....