2017-06-26 4 views
0

スクリプトでcsv.reader()を何度か使用する必要があるスクリプトを作成しています。私はスクリプトの初期段階でそれを使って、sqlite3テーブルに初期の主キーデータを設定します。私はその後、csvに含まれているものに基づいてテーブルのデータを変更するために、後で再度使用します(この注文の正当な理由があると私は約束します)。Pythonのpythonのcsv.readerが実際にデータを取得していないようです

問題は2回目に発生します - 私のsqlite3テーブルは、最初のcsvリーダーではっきりと読み込まれます。つまり、最初のcsv.reader()はデータがどこから来るかで動作します。しかし、後でそれを繰り返すと、データはありません。 csv.reader()が完全に空であるように見えます。

csv.reader()はスクリプトごとに1つのcsv.reader()オブジェクトのみを許可しますか?私はそれが状況であるとは想像できません。ここで

は動作するコードです。(初期データと私のテーブルを移入)

for file in files: 
    f = open(file) 
    csv_f = csv.reader(f) 
    count = 0 
    for row in csv_f: 
     #more code 
    f.close() 

ここで同じスクリプトの後半でないコードです:

for file in files: 
    print "opening file ", file 
    f = open(file) 
    csv_n = csv.reader(f) 
    count = 0 
    thisList = list(csv_n) 

キャストタイプは、リストは驚くべきことではない、そうですか?私は真剣にこの問題を解決する方法を失っています。

+0

ファイルを複数回開くか、 'f'ハンドルを再利用しますか?なぜなら、ファイルの最後にいると、なぜ2回目に失敗するのか不思議ではないからです。 –

+0

初めてファイルを開いた後でファイルを閉じましたか?最初にテーブルに値を設定した後に 'f.close()'を使用してください。また、 'with'ステートメントを使用すると、そのようなエラーからあなたを救うことができます。 –

+0

私はfハンドルを再利用しますが、毎回ファイルを閉じました。最初の反復の終わりに、私はファイルを閉じます。この例を更新してそれを表示します。それが問題ではないことを確認するために、ハンドルの名前を変更しました。まだ問題は残っています。 – dmcoding

答えて

0

list(csv_n)表現は、CSV行のlistを生成します:

>>> import csv 
>>> f = open("ooo.csv", "rb") 
>>> r = csv.reader(f) 
>>> list(r) 
[['a', 'b', 'c'], ['1', '2', '3']] 

それはない「型キャスト」(ヒント:そこにPythonで「型キャスト」のようなものだしない)だとしますありませんあなたの "csv"を他のものに変更してください。あなたはすなわち使用して、手動でリストを作っていたかのように

>>> r 
<_csv.reader object at 0x7f34964b7600> 

は、実際には正確同じです:

>>> lst = [] 
>>> for row in r: 
>>> lst.append(row) 

、少しより速く、より少ないコードで。

唯一の副作用は、手動反復処理の場合と同様に、ファイル全体を読み取るため、ファイルポインタをファイルの最後に設定するため、同じcsvリーダー(またはファイルそれ自体が)期待どおりに動作しません。

>>> r.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> f.seek(0) 
>>> r.next() 
['a', 'b', 'c'] 

だからあなたの問題は、(「すべてが壊れている、」全く役に立たない問題の説明がBTWである)である、それが何であれ:あなたはcsvファイルを再読み込みしたい場合は、最初にファイルポインタをリセットする必要がありますlist(csv_n)を使用するのではなく、おそらくそれが何をしているのか理解していない可能性があります。

NB:あなたが書いた私は後でそれを反復処理するときただし、データが存在しない

こと。それは)(csv.readerのように見えるあなたはもちろんの、その後、csv_nthisList = list(csv_n)行を反復処理しようとした場合

完全に空であるあなたは何を得ることはありません、上記のCF。ファイルポインタを最初に巻き戻すだけでOKです。

関連する問題