2017-07-11 1 views
0

Le programme Python3 ci-dessous copie de deux manières le contenu d'un fichier txt en listes. Le fichier txt ne contient aucun caractère caché (contrôle).Pyton3 Copie de données de fichier dans des listes avec et sans eval()

J'ai trois questions:

  1. Pourquoi lst_data[0:10] après 3 éléments tronqués?

  2. Pourquoi eval() donne la solution, les 10 éléments attendus? Comment copier un fichier txt dans une liste sans utiliser eval()?


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() 

fichier NE CONTIENT PAS PERSONNAGES CACHÉ!

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

pourquoi seulement 3 LISTE DES ELEMENTS-SAINES eval()! !

lst_data [00:10] [0, 1, 2,

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

SORTIE RICHT WHITH 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()' retourne toujours une chaîne; '[0, 1, 2,' est arrivé à être les 10 premiers caractères de cette chaîne.Cela ne va pas vous donner un type de données différent, simplement parce que le contenu de la chaîne ressemble à ce type. 'ast.literal_eval()' serait une alternative sûre à 'eval()' dans ce cas. – jasonharper

+0

Vous pouvez appeler 'repr' sur vos différentes variables et tranches au lieu d'appeler' str'. De cette façon, vous seriez en mesure de voir que 'lst_data' n'est pas en fait une liste, mais plutôt une chaîne (vous verrez les guillemets dans son' repr'). – Blckknght

Répondre

0
  1. Comme mentionné @jasonharper, read() retourne une chaîne.

    (Essayez print(type(read_file.read()))).

    Donc, lorsque vous le découpez avec , vous obtenez seulement les 10 premiers caractères: "[0, 1, 2, " (notez l'espace). Par contre, eval est, par définition, en train d'essayer d'évaluer votre chaîne et de la reconnaître comme une liste, c'est ce que vous obtenez.

  2. Si vous voulez éviter d'utiliser eval (et pour des raisons de sécurité, vous devriez vraiment), vous devez écrire un analyseur. Si votre fichier doit toujours être de cette forme (une liste d'entiers, mis en forme de façon python), vous pouvez obtenir votre liste d'entiers avec:

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

    Notez que l'utilisation des expressions régulières serait beaucoup plus propre.

+0

Tout d'abord des réservoirs pour la réaction de jour. Je me rends compte que dans les données Python qui ressemblent à une liste peut être une chaîne ... Mais wat je veux vraiment est hors d'un fichier txt (avec des données qui ressemble à une liste d'entiers) obtenir une vraie liste Python –

+0

pas spécifique à Python. Dans chaque langage informatique, il existe une différence stricte entre data _value_ et data _representation_. Maintenant, mon troisième point est exactement ce que vous cherchez. Après ces deux lignes, les données seront une liste avec les entiers qui sont écrits dans votre fichier. – b1ch0u

+0

Désolé, vous avez raison! J'ai fait une erreur dans le programme de contrôle, il semblait donc y avoir une chaîne à nouveau. Je suis très content de votre solution, merci encore! –