2011-03-13 4 views
0

while 루프를 처리하는 동안 오류가 발생했습니다. 실행할 번호를 입력 할 수 있으며 결과는 해당 .CSV에 올바르게 기록됩니다. 해당 번호의 섹션이 실행되고 나면 새 번호로 다시 시도할지 묻는 메시지가 표시됩니다. 새로운 숫자 코드를 실행하고 새로운 .CSV를 생성하지만 파일 크기는 0kb로 유지됩니다. 이 작업은 일단 완료되면 파일을 닫는 것과 관련이 있다고 생각했지만 거기에 f # .close()를 작성했습니다.Python : while 루프에서 파일을 닫는 중 문제가 발생했습니다.

예 : 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() 

: 파이썬 2.6 사용 Windows에서/여전히 파이썬 배우기 -

+5

계속 것인가? –

+0

파일 논리가 정상적으로 보입니다. ''의 개폐 사이에 어떤 현상이 발생합니까? –

+0

'if number == n :'코드를 함수로 넣지 않아도되므로 코드를 변경하면 3 개 (또는 그 이상)를 입력 할 필요가 없습니다. –

답변

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.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 
관련 문제