2017-07-07 2 views
0

Es gibt eine Eingabedatei "input.txt". Es sieht aus wie:Warum wird dieser Code falsch ausgeführt?

7 
4 
2 
5 
2 
9 
8 
6 
10 
8 
4 

Und es gibt einen Code:

inn = open("/storage/emulated/0/input.txt", "r") 
a = 0 
b = 10 
array = [] 

while not a == b: 
    for i, line in enumerate(inn): 
     if i == a: 
       array += str(line) 
    a+=1 
print(array) 

ich alle Zahlen in "Array" Variable setzen müssen, aber wher ich den Code ausführen - ich leer "Array" . Gibt es einen Fehler in einem Code?

(sorry für solche Noob Frage)

+0

du modifizierst überhaupt nicht 'array' ... –

+0

Wie wäre es mit einem Ausdruck in deinem' if' Block zu sehen, ob er tatsächlich ausgeführt wird? – khelwood

+0

Verwenden Sie einfach 'array = numpy.genfromtxt (Dateiname, dtype = int)' 'um diese Werte in die Variable' array' einzulesen. – Michael

Antwort

1

ich deine Fehler nicht reproduzieren kann. Außerdem erhalte ich kein leeres Array, wenn Sie Ihren Code ausführen. Siehe den folgenden Code und die Ergebnisse. Ich schlage immer noch vor, np.genfromtxt zu verwenden, wenn die Eingabedaten so sauber sind wie Ihre.

Code:

import numpy as np 

# I have input.txt in same directory as this .py-file 

# np.genfromtxt with int and with string 
approach1a = np.genfromtxt('input.txt', dtype=int) 
approach1b = np.genfromtxt('input.txt', dtype=np.str_) 

# list comprehension 
approach2 = [] 
with open('input.txt') as file: 
    approach2 = [str(line) for line in file] 

# like your approach, but without a, b and the if statement 
approach3 = [] 
with open('input.txt') as file: 
    for line in file: 
     approach3.append(line) 

# your code 
inn = open("input.txt", "r") 
a = 0 
b = 10 
array = [] 
while not a == b: 
    for i, line in enumerate(inn): 
     if i == a: 
      array += str(line) 
    a+=1 

Ergebnisse:

>>> approach1a 
array([ 7, 4, 2, 5, 2, 9, 8, 6, 10, 8, 4]) 
>>> approach1b 
array(['7', '4', '2', '5', '2', '9', '8', '6', '10', '8', '4'], 
     dtype='<U2') 
>>> approach2 
['7\n', '4\n', '2\n', '5\n', '2\n', '9\n', '8\n', '6\n', '10\n', '8\n', '4'] 
>>> approach3 
['7\n', '4\n', '2\n', '5\n', '2\n', '9\n', '8\n', '6\n', '10\n', '8\n', '4'] 
>>> array 
['7', '\n'] 

Der Grund, dass nur die erste Zeile der inpur Datei mit Ihrem Code gelesen wird, weil mit open Sie nur über die Leitungen laufen können einmal. Wenn Sie das getan haben, können Sie nicht zurückgehen. Um das zu verstehen, siehe zum Beispiel @Aaron Hall anwer this question: es gibt nur eine Methode next, aber es gibt keine Möglichkeit, zurückzugehen (in diesem Fall, um eine Zeile zurück zu gehen). Sie haben den Punkt erreicht, an dem alle Zeilen von open einmal verwendet wurden, als Sie den Wert a auf 1 festgelegt haben, d. H. Nachdem Sie die erste Zeile der Eingabedatei zu array hinzugefügt haben. Aus diesem Grund verstehe ich, dass Ihr Code nur die erste Zeile liest, warum ich Sie nicht reproduzieren kann, Sie haben array als eine leere Liste und warum schlug ich approach3 vor.

+0

Vielen Dank :) – maxpushka

Verwandte Themen