2017-07-11 1 views
0

Das folgende Python3-Programm kopiert auf zwei Arten den Inhalt einer TXT-Datei in Listen. Die TXT-Datei enthält keine versteckten (Steuer) Zeichen.Pyton3 Kopieren von Datei-Daten in Listen mit und ohne eval()

Ich habe drei Fragen:

  1. Warum ist lst_data[0:10] nach 3 Elemente abgeschnitten?

  2. Warum eval() gibt die Lösung, die erwarteten 10 Elemente?

  3. Wie kann ich eine TXT-Datei ohne die Verwendung von eval() in eine Liste kopieren?


import os 
lst_data = [] 
lst_eval = [] 

read_file=open("file.txt","r") 
print("file DOES NOT CONTAIN HIDDEN CHARACTERS!") 
print("Content file.txt " + read_file.read()) 
read_file.close() 

read_file=open("file.txt","r") 
print("WHY ONLY 3 LIST-ELEMENTS WHITHOUT eval()!!") 
lst_data = read_file.read() 
print("lst_data[0:10] " + str(lst_data[0:10])) 
print("lst_data " + str(lst_data)) 
read_file.close() 

read_file=open("file.txt","r") 
print("OUTPUT RICHT WHITH eval()!!") 
lst_eval = eval(read_file.read()) 
print("lst_eval[0:10] " + str(lst_eval[0:10])) 
print("lst_eval " + str(lst_eval)) 
read_file.close() 

Datei nicht HIDDEN Zeichen lang sein!

Inhalt datei.txt [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

warum nur 3 LIST-ELEMENT whithout eval()! !

lst_data [00.10] [0, 1, 2,

lst_data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

OUTPUT RICHT WHITE Eval() !!

lst_eval [00.10] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

lst_eval [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9, 10, 11, 12]

+0

'file.read()' gibt immer einen String; '[0, 1, 2,' waren die ersten 10 Zeichen dieser Zeichenfolge.Es wird nicht magisch Ihnen einen anderen Datentyp geben, nur weil der Inhalt der Zeichenfolge wie dieser Typ aussieht. 'ast.literal_eval()' wäre in diesem Fall eine sichere Alternative zu 'eval()'. – jasonharper

+0

Sie könnten "repr" für Ihre verschiedenen Variablen und Slices aufrufen, anstatt "str" ​​aufzurufen. Auf diese Weise könnten Sie sehen, dass 'lst_data' keine Liste ist, sondern eine Zeichenfolge (Sie sehen die Anführungszeichen in 'repr'). – Blckknght

Antwort

0
  1. Als @jasonharper erwähnt, read() gibt eine Zeichenfolge.

    (versuchen Sie print(type(read_file.read()))). Wenn Sie es mit [0:10] schneiden, erhalten Sie nur die ersten 10 Zeichen: "[0, 1, 2, " (beachten Sie die Leerzeichen).

  2. Im Gegenteil, eval ist -durch Definition- versucht, Ihre Zeichenfolge zu bewerten und erkennt sie als eine Liste, also ist das, was Sie bekommen.

  3. Es Sie vermeiden wollen, mit eval (und aus Gründen der Sicherheit, sollten Sie wirklich), benötigen Sie einen Parser zu schreiben. Wenn die Datei immer dieser Form (eine Liste von ganzen Zahlen, Pythons Weise formatiert) sein sollte, könnten Sie Ihre ganze Zahlen Liste mit bekommen:

    s = read_file.read()[1: -1] # remove the brackets 
    data = list(map(int, s.split(','))) 
    

    Beachten Sie, dass mit regulären Ausdrücken wäre viel sauberer.

+0

Zuerst aller Tanks für Jour-Reaktion. Ich weiß, dass in Python Daten, die wie eine Liste aussehen kann eine Zeichenfolge sein kann ... Aber was ich wirklich will ist aus einer TXT-Datei (mit Daten, die als eine Liste von ganzen Zahlen aussieht) bekommen eine echte Python-Liste –

+0

Es ist nicht spezifisch für Python. In jeder Computersprache gibt es einen strikten Unterschied zwischen Daten _value_ und Daten _representation_. Jetzt ist mein dritter Punkt genau das, wonach Sie suchen. Nach diesen zwei Zeilen werden Daten eine Liste mit den ganzen Zahlen sein, die in Ihrer Datei geschrieben sind. – b1ch0u

+0

Entschuldigung, du hast Recht! Ich habe einen Fehler im Steuerungsprogramm gemacht, also schien es, als wäre wieder eine Schnur da. Ich bin sehr glücklich mit Ihrer Lösung, nochmals vielen Dank! –

Verwandte Themen