2017-07-28 4 views
1

für meine Kodierung Aufgabe Ich soll eine Datei erstellen, die eine CSV-Datei lesen wird, bieten verschiedene Attribute zu tun Analyse (bestimmt durch die Spalte Werte. Ich hatte diesen Code perfekt funktioniert, aber nach I ich habe meine erste try/außer Block begonnen, die folgende Störung zu erhalten:.Try/Except Block verursacht ValueError

Traceback (most recent call last): File "/Users/annerussell/Dropbox/Infotec 1040/module 8/csval.py", line 49, in row1=next(reader, 'end')[0:] ValueError: I/O operation on closed file.

Here ist ein Link zu einer Datei, die Sie testen können, wenn gewünscht Wie Sie wahrscheinlich erraten dies eine Klassenzuordnung ist, und ich arbeite auf dem Lernen von Python für gradschool sowieso, also irgendwelche Vorschläge werden sehr geschätzt


import csv 
print('Welcome to CSV Analytics!') 

# Get file name and open the file 
while True: 
    try: 
     file_name = input('Enter the name of the file you would like to process: ') 
     with open(file_name, "rt") as infile: 

# Select the attribute to be analyzed 

     reader=csv.reader(infile) 
     headers=next(reader)[0:] 
     max=len(headers) 
    except FileNotFoundError: 
     print('The file you entered could not be found. Please' \ 
      + ' enter a valid file name, ending in .csv.') 
     continue 

    except IOError: 
     print('The file you selected could not be opened. Please ' \ 
      + 'enter a valid file name, ending in .csv.') 
     continue 
    except: 
     print('There was an error opening or reading your file. Please ' \ 
      + 'enter a valid file name, ending in .csv.') 
     continue 
    else: 


     print ('The attributes available to analyse are:') 

     for col in range(1, max): 
     print(col, headers[col]) 
     while True: 
     try: 
      choice=int(input('Please select the number of the attribute you would like to analyze ')) 
     except: 
      print('Please enter the numeric value for the selection you choose.') 
      continue 
     else: 
# Build a dictionary with the requested data 
      dict1= {} 
      numrows=-1 
      row1=[] 
      largest_value=0 
      key_of_largest_value=0 
      while row1 != 'end': 
      row1=next(reader, 'end')[0:] 
      if row1 !='end': 
       numrows += 1 
       key=row1[0] 
       value=float(row1[choice]) 
       dict1[key] = value 
       if value>largest_value: 
        largest_value=value 
        key_of_largest_value=key 
      # print('dictionary entry (key, value)', key, value) 
      print('Largest ', headers[choice], ' value is ', key_of_largest_value, ' with ', largest_value) 

Antwort

0

Kurz gesagt: Nach with Block endet, Datei ist geschlossen. Sie können nicht lesen, reader wird fehlschlagen. Wahrscheinlich haben Sie nicht bemerkt, dass es Einraumeinrückung für with gibt, ersetzen Sie es durch den gemeinsamen Einzug, damit es klarer wird.

Suche nach python context manager für tieferes Verständnis.

Vorschlag hier ist, um alle Logik aus Versuch else Block zu process_file Funktion, und rufen Sie es innerhalb with Anweisung.

with open(file_name, "rt") as infile: 

    # Select the attribute to be analyzed 

    reader=csv.reader(infile) 
    headers=next(reader)[0:] 
    max=len(headers) 
    process_file(reader, headers, max) # <-- like that 
0

with benutzen, müssen Sie in den zweiten Zustand, um es zu bewegen blockieren oder

ersetzen

with open(file_name, "rt") as infile: 

mit

isProcessing = True 
while isProcessing: 
    .... 
    infile = open(file_name, "rt") 
    ... 
    #end of line 
    #print('Largest ',.... 
    infile.close() 
    # end the loop 
    isProcessing = False 
+0

Das funktionierte perfekt meine Fehler zu lösen; Es führte jedoch zu einem anderen Problem. Jetzt, mit meiner zweiten try/expect-Klausel, wird die Schleife nach der Ausführung des Codes fortgesetzt und der Benutzer aufgefordert, ein Attribut auszuwählen. Ich habe versucht, Pause nach meiner else Aussage hinzuzufügen, und das hat nicht geholfen. –

+0

es Schleife halten, weil Sie 'while True verwenden:' ändern Sie es in Variable, so können wir es wahr oder falsch wie 'während isProcessing wechseln:' siehe aktualisierte Antwort – ewwink

Verwandte Themen