2017-01-28 4 views
0

Ich hatte eine Funktion, die ich eine Datei lesen und mehrere Werte davon zurückgeben wollte, obwohl ich Probleme habe zu verstehen, wie dies funktionieren würde. Zum Beispiel, wenn meine Textdatei wie folgt aussehen:Mehrere Zeilen aus einer Textdatei in Python zurückgeben

John 2543 
Jack 2453 
Henry 3672 
Jane 2405 
Terry 9863 

Und mein Code wie folgt:

def function(): 

    file = open('file.txt')  

    for lines in file: 
     name, number = lines.split(' ') 
     return name 

def main(): 
    print(function()) 

main() 

Dies gibt nur einen Namen aus einer Zeile, wo, wie ich die gesamte erste Säule soll. Ich verstehe, dass, wenn ich eine Druckfunktion statt eine zurückgeben würde, die funktionieren würde. In diesem Szenario möchte ich jedoch die Werte zurückgeben, damit ich sie in Verbindung mit meinen anderen Funktionen verwenden kann. Vielen Dank.

EDIT:

Ich hatte auch eine Follow-up-Frage, wie ich die zwei Spalten nebeneinander gedruckt werden würde, während eine Funktion jeder Spalte widmet. So normalerweise, wenn ich eine Spalte nach dem anderen drucken würde es wie folgt aussehen:

John 
Jack 
Henry 
Jane 
Terry 
2543 
2453 
3672 
2405 
9863 

, wenn ich sie erscheinen soll, wie:

John 2543 
Jack 2453 
Henry 3672 
Jane 2405 
Terry 9863 

Antwort

0

hier ist eine Lösung mit einem Generator. yield Jede Zeile Ihrer Datei kann nützlich sein, wenn Ihre Datei groß ist. das verhindert, dass die gesamte Datei in den Speicher gelesen werden muss.

Der Inhalt der Datei wird dann in einer for Schleife behandelt.

beachten Sie auch die with Anweisung, um die Datei zu öffnen. dies sorgt dafür, dass es geschlossen wird (auch wenn das Programm abstürzt) und ist der pythonische Weg, um aus einer Datei zu lesen.

def function(): 

    with open('file.txt') as file: 

     for line in file: 
      name, value = line.split() 
      value = int(value) 
      yield name, value 

# here you can do what you need to for all the data in the file 
for name, value in function(): 
    print(name, value) 

i nahm sich die Freiheit value zu einem int zu werfen. weiß nicht, ob das ist nützlich für Sie ...

, wenn Sie Zeile/Spalte ändern müssen, dann müssen Sie alle in den Speicher lesen und man konnte dazu:

data = [(names, values) for names, values in function()] 
names = [item[0] for item in data] 
values = [item[1] for item in data] 

Sie könnten dann ziemlich -print das mit:

separator = '|' 
name_lst = ['{:6s}'.format(name) for name in names] 
value_lst = ['{:<6d}'.format(value) for value in values] 

# join the lists to str 
print(separator.join(name_lst)) 
print(separator.join(value_lst)) 

# John |Jack |Henry |Jane |Terry 
# 2543 |2453 |3672 |2405 |9863 
+0

Hallo, was, wenn ich die andere Spalte durch eine separate Funktion zurückgeben musste? – DrMoe

+0

@DrMoe meinst du den, den ich "Wert" nenne? Sie könnten die gleiche Funktion verwenden und nur "Yield Value". –

+0

Aber wenn ich das tue würde die zweite Liste nicht einfach nach der anderen drucken? Was, wenn sie nebeneinander gedruckt werden sollen? – DrMoe

0

Wenn Sie einen Wert gibt die Funktion beendet und die Steuerung kehrt sofort zu die Funktion, die es aufgerufen hat. Wenn Sie also innerhalb der Schleife zurückkehren, führen Sie die Schleife niemals mehr als einmal aus, bevor die Funktion beendet wird und ihren Rückgabewert an die aufrufende Funktion übergibt.

Sie müssen zuerst die gesamte Liste erstellen, und dann geben Sie es zurück.

def function(): 
    with open('file.txt') as file: 
     names = [] 
     for line in file: 
      names.append(line.split()[0]) 

    return names 

oder

def function(): 
    with open('file.txt') as file: 
     return [line.split()[0] for line in file] 

und es wie folgt verwendet werden:

def main(): 
    for name in function(): 
     print(name) 
+0

ich sehe. Um sie dann durch die Hauptfunktion zu übertragen, müsste ich über die Liste iterieren, um sie im Spaltenformat zu drucken, oder? – DrMoe

+0

Was, wenn ich es für beide Spalten jedoch tun wollte und sie beide auf den gleichen Linien halten? Wenn ich es so mache wie oben gezeigt würde die zweite Spalte nicht nach der ersten kommen? Dies ist, wenn wir sagen, hypothetisch musste ich eine zweite Funktion verwenden, um die zweite Spalte zurückzugeben. – DrMoe

Verwandte Themen