2011-03-13 9 views
0

whileループを処理するときにエラーが発生しました。私は実行したい番号を入力することができ、結果は対応する.CSVに正しく書き込まれます。その番号のセクションが実行されたら、新しい番号で再試行するかどうか尋ねられます。それは新しい数値コードを実行し、新しい.CSVを作成しますが、ファイルサイズは0kbのままです。私はこれが完了したらファイルを閉じることと関係があると思ったが、そこにf#.close()を書いた。Python:whileループでファイルを閉じる際の問題

例:番号1を選択し、#1のコードを実行し、.CSVを正しく保存し、別の実行と新しい番号(#2)に「はい」を選択するとコード2が実行されますが、 2番目のCSV。

これは、1番目と2番目のどちらを選択したかにかかわらず発生します。 (例:。。その後2及び実行を選択しますが、正しく保存されません、最初の3を選ぶ3つの実行ファイン、ファインセーブ):

f1 = file('1.csv', 'rb') 
f2 = file('2.csv', 'rb') 
f3 = file('3.csv', 'rb') 

c1 = csv.reader(f1) 
c2 = csv.reader(f2) 
c3 = csv.reader(f3) 

number = raw_input("Enter number: ") 

while True: 
    if number == "1": 
     f4 = file('No_1_Results.csv', 'wb') 
     c4 = csv.writer(f4) 
     <snip> #do stuff here 
     print "Took ", time.time() - start, "seconds." 
     f4.close() 
     reset_answer = raw_input("Again? Type Y or N : ") 
     if reset_answer == ("n" or "N"): 
      print "Bye! from #1" 
      break 
     if reset_answer == ("y" or "Y"): 
      number = raw_input("Enter new number #: ") 
      continue 
     if reset_answer != ("n" or "N" or "y" or "Y"): 
      print "Y or N only allowed. Try again." 
      continue 

    if number == "2": 
     f5 = file('No_2_Results.csv', 'wb') 
     c5 = csv.writer(f5) 
     <snip> #do stuff here 
     print "Took ", time.time() - start, "seconds." 
     f5.close() 
     reset_answer = raw_input("Again? Type Y or N : ") 
     if reset_answer == ("n" or "N"): 
      print "Bye! from #2" 
      break 
     if reset_answer == ("y" or "Y"): 
      number = raw_input("Enter new number #: ") 
      continue 
     if reset_answer != ("n" or "N" or "y" or "Y"): 
      print "Y or N only allowed. Try again." 
      continue 

    if number =="3": 
     f6 = file('No_3_Results.csv', 'wb') 
     c6 = csv.writer(f6) 
     <snip> #do stuff here 
     print "Took ", time.time() - start, "seconds." 
     f6.close() 
     reset_answer = raw_input("Again? Type Y or N : ") 
     if reset_answer == ("n" or "N"): 
      print "Bye! from #3" 
      break 
     if reset_answer == ("y" or "Y"): 
      number = raw_input("Enter new number #: ") 
      continue 
     if reset_answer != ("n" or "N" or "y" or "Y"): 
      print "Y or N only allowed. Try again." 
      continue 

    if number is not "1" or "2" or "3": 
     print "Invalid number selected." 
     number = raw_input("Please choose a number: ") 
     continue 

f1.close() 
f2.close() 
f3.close() 

:Pythonの2.6を使用して

ここに私の現在のコードですWindowsの場合/まだPythonを学んでいる場合 -

+5

を続けるのでしょうか? –

+0

ファイルのロジックが正常に見えます。オープンとクローズの間の ' 'で何が起こっていますか? –

+0

'if number == n:'コードを関数として入れて3つ(コードを変更した場合はそれ以上)を入力する必要はないのはなぜですか? –

答えて

4

ループの最初に開いたファイル記述子(f1、f2、f3)で正確に何をしているのか知っているといいでしょう。それにもかかわらず、あなたが持っている問題は、あなたがそれらのファイルディスクリプタの1つから2回読み取ろうとしているという事実に関連していると思いますが、そのときの位置をリセットしていません。以下を見てください:

ファイルから読み込んだファイルディスクリプタは、最後の読み込み時の位置を記憶しています。あなたの問題を解決するには、追求し、ファイルの始まりに行く実行する必要があります:

$ echo "Test reading from a file" >> test.out 
$ python 
>>> f1 = file('test.out') 
>>> f1.readlines() 
['Test reading from a file\n'] 
>>> f1.seek(0) 
>>> f1.readlines() 
['Test reading from a file\n'] 

私は、これはあなたが持っている問題であると思いますが、そうでない場合は、ファイルを読み込むときに、あなたが持っているロジックを示すべきです。

+0

ありがとうございます。 'f1.seek(0)'は私の問題を修正しました。 – serk

+0

@serk、他のfdにも同じ問題があるかどうかを調べてください。ループを並べ替えると、ソリューションがきれいになります。 – mandel

0
import csv 

try: 
    inp = raw_input # Python 2.x 
except NameError: 
    inp = input  # Python 3.x 

def processFile(infname, outfname, perRow): 
    with open(infname,'rb') as inf, open(outfname,'w') as outf: 
     incsv = csv.reader(inf) 
     outcsv = csv.writer(outf) 
     outcsv.writerows(perRow(row) for row in incsv) 
    print("{0} -> {1} successful".format(infname, outfname)) 

def doStuff(row): 
    # do stuff here 
    return row 

def main(): 
    while True: 
     name = inp('Enter next file name (or nothing to exit)') 
     if name.strip(): 
      try: 
       processFile(name+'.csv', name+'_result.csv', doStuff) 
      except IOError, e: 
       print(e) 
     else: 
      print("Goodbye.") 
      break 

if __name__=="__main__": 
    main() 

編集:Python: Comparing two CSV files and searching for similar itemsへのあなたのリンクを見た後、私はあなたが少し反復そのコードを見つけることができません。

def readMasterList(): 
    res = {} 
    with open('masterlist.csv','rb') as inf: 
     incsv = csv.reader(inf) 
     head = incsv.next() # skip header row 
     for rownum,dat in enumerate(incsv): 
      res[tuple(dat)] = rownum 
    return res 
masterList = readMasterList() 

def doStuff(row, _ml=masterList): 
    key = (row[1], row[3]) 
    try: 
     rownum = _ml[key] 
     row.append("FOUND in master list (row {0})".format(rownum)) 
    except KeyError: 
     row.append("NOT FOUND in master list") 
    return row 
関連する問題