2017-05-31 6 views
0

Ich soll für ein Programm codieren, das einen Benutzer ständig nach einem Dateinamen fragt, bis er den richtigen eingibt. Dann soll der find_min_percent ein Argument, eine Zeile (str) aus der Datei GDP.txt nehmen, dann durch die Zeile iterieren, um den kleinsten Wert zu finden und diesen Wert zurückzugeben. Hier ist mein Code so weitPython-Programm: Lesen einer Datei

line = " " 

def open_file(): 
    ''' Repeatedly prompt until a valid file name allows the file to be opened.''' 
    while True: 
     user_input = input('Enter a file name: ') 
     try: 
      file = open(user_input, 'r') 
      return file 
      break 
     except FileNotFoundError: 
      print('Error. Please try again') 
      open_file() 

def find_min_percent(line): 
    '''Find the min percent change in the line; return the value and the index.''' 
    percent_lst = [] 
    line = file.readline(9) 
    percent_lst += [line] 
    percent_int = [float(i) for i in percent_lst] 
    min_value = 10000 
    for percent in percent_int: 
     if percent < min_value: 
      min_value = percent 
      return min_value 


print(open_file()) 
print (find_min_percent(line)) 

Mein Problem ist mit der readline(). Es besagt, dass die Variablendatei nicht definiert ist. Der Umriss dieses Codes enthält keine Datei im Teil "def find_min_percent (line):". Also weiß ich nicht, wie ich das beheben würde. Ich kann die Zeile auch nicht außerhalb der Funktion setzen, weil ich die gleiche Zeilenvariable für andere Funktionen später im Programm verwenden muss, um andere Zeilen zu lesen. Also ich weiß nicht, was zu tun ist, damit es nicht hält

+1

Warum speichern Sie nicht den Rückgabewert von 'open_file()' und übergeben ihn in 'find_min_percent'? 'print (open_file())' ruft 'open_file()' auf, gibt die Darstellung des zurückgegebenen Dateiobjekts aus und verwirft es dann. –

+1

Oups! Das Wiederholen von einem Fehlerhandler ist eine ** sehr ** schlechte Idee ... Bitte entfernen Sie die 'break' Zeile von' open_file' (nutzlos nach einer 'return'), und entfernen Sie die schreckliche' open_file' Zeile vom Ende des Funktion. –

Antwort

2

Eine Variable, die Sie in einer Funktion definieren, kann nicht von der anderen zugegriffen werden. Um dies zu beheben, könnte man zum Beispiel tut dies (speichert den Rückgabewert in einem „Hauptfunktion“ Variable und übergibt es an Ihre nächste Funktion):

def find_min_percent(line): 
    '''Find the min percent change in the line; return the value and the index.''' 
    percent_lst = [] 
    # You can use f from this function, as long as you don't modify it 
    line = f.readline(9) 
    percent_lst += [line] 
    percent_int = [float(i) for i in percent_lst] 
    min_value = 10000 
    for percent in percent_int: 
     if percent < min_value: 
      min_value = percent 
      return min_value 


f = open_file() 
print(f) 
print (find_min_percent(line)) 

By the way, die Art und Weisen Sie Ihre verwenden line Variable ist komisch. Es wird nur innerhalb von find_min_percent verwendet, aber außerhalb der Funktion definiert und sogar als Parameter übergeben. Warum? Was versuchst du zu erreichen?

(siehe here für eine Stelle über den Zugriff auf Variablen außerhalb einer Funktion definiert)

+0

Wie ich am Ende der Post gesagt habe, ist das eigentliche Programm, das ich schreiben soll, viel länger als das. Ich schreibe den Code Stück für Stück und das ist soweit ich soweit gekommen bin. Der Grund, warum ich es außerhalb der Funktion definiert habe, ist, dass ich später einen find_max_percent und find_gdp haben muss, der den Zeilenstring übernimmt. – Nora

+1

Dies muss kein Problem sein. Sie können eine "globale" Variable "f" oder "Datei" haben, auf die Sie überall in Ihrem Modul zugreifen können (solange sie außerhalb einer Funktion definiert ist). Ich werde meine Antwort bearbeiten, damit Sie sehen können. –

+0

@NouraAsrar: Wenn Sie möchten, dass 2 Funktionen eine Variable teilen, ist der beste Weg, einen Parameter wie Thomas zu übergeben, wie hier gezeigt. Ein alternativer Weg, der nur in speziellen Anwendungsfällen verwendet werden sollte, ist eine globale Variable. Wenn Sie es in Ihren Funktionen jedoch nicht als global deklarieren, wird 'file' in' open_file' eine lokale Variable sein, die die globale versteckt! Wenn Sie diesen Satz nicht verstehen, halten Sie sich von globalen Variablen fern ... –

0

Der zurück file Variable ist aus dem Umfang der Funktion Festcode

line = " " 

def open_file(): 
    ''' Repeatedly prompt until a valid file name allows the file to be opened.''' 
    while True: 
     user_input = input('Enter a file name: ') 
     try: 
      file = open(user_input, 'r') 
      return file 
      break 
     except FileNotFoundError: 
      print('Error. Please try again') 
      open_file() 

def find_min_percent(line,file): 
    '''Find the min percent change in the line; return the value and the index.''' 
    percent_lst = [] 
    line = file.readline(9) 
    percent_lst += [line] 
    percent_int = [float(i) for i in percent_lst] 
    min_value = 10000 
    for percent in percent_int: 
     if percent < min_value: 
      min_value = percent 
      return min_value 

temp=open_file() 
print(temp) 
print (find_min_percent(line,temp)) 
0

Eine andere Möglichkeit, doing this:

def open_file(): 
    ''' Repeatedly prompt until a valid file name allows the file to be opened.''' 
    while True: 
     user_input = input('Enter a file name: ') 
     try: 
      file = open(user_input, 'r') 
      print('user_input: ', user_input) 
      line = file.readline(9) 
      file.close() 
      return find_min_percent(line) 
     except FileNotFoundError: 
      print('Error. Please try again') 
      open_file() 

def find_min_percent(line): 
    '''Find the min percent change in the line; return the value and the index.''' 
    percent_lst = [] 
# line = file.readline(9) 
    percent_lst += [line] 
    percent_int = [float(i) for i in percent_lst] 
    min_value = 10000 
    for percent in percent_int: 
     if percent < min_value: 
      min_value = percent 
      return min_value 


print(open_file()) 

Beachten Sie, dass ich nicht sur bin e über die Richtigkeit Ihrer find_min_percent Methode. Wenn Sie die Datei manuell öffnen (ohne with open zu verwenden), müssen Sie auch explizit schließen.