2011-03-13 32 views
0

我在处理while循环时遇到了错误。我可以输入我想要运行的编号,并将结果正确写入相应的.CSV。一旦该号码的部分完成运行,它会询问我是否想用新号码重试。它运行新的数字代码并创建新的.CSV,但文件大小保持在0kb。我认为这与完成文件关闭有关,但我已经在那里写了f#.close()。Python:在while循环中关闭文件的问题

例如:选择编号1,代码#1运行并正确保存.CSV,为另一个运行和新编号(#2)选择是,代码#2运行但未正确关闭,因此不保存任何信息第二个CSV。

无论我选择第一位还是第二位,都会发生这种情况。 (例如:第一选择3,3运行正常,并保存得很好,那么选择2和运行,但不保存正确。)

这里是我当前的代码:

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

为什么不把你的整个'如果number == n:'代码作为一个函数,所以你不必输入三个(或更多,如果你改变你的代码)? –

回答

4

很高兴知道您在循环开始时打开的文件描述符(f1,f2,f3)到底在做什么。不过,我相信你所遇到的问题与你试图从其中一个文件描述符中读取两次的事实有关,但是当你这样做的时候你没有重新设置它们的位置。看看下面的内容:

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

从文件读取后,文件描述符会记住您的位置形式的最后一次读取。为了解决你的问题,你就必须进行寻找和前往该文件的开头:

$ 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