2016-03-19 6 views
0

Ich habe eine Datei projects.txt genannt, die die folgende Codezeile enthält:Python-Ladeliste von Datei- und Druck zufällige Auswahl

['Apollo', 'Astro', 'Aurora', 'Barcelona'] 

Ich verwende den folgenden Python2 Code, um die Datei zu laden und versuchen, eine zufällige Auswahl drucken aber ich bin immer nur ein einzelnes Zeichen aus meiner Liste bekommen:

import random 

projNames = open('projects.txt').read() 
print(random.choice(projNames)) 

Beispiel Ergebnis: ein


Wenn ich jedoch den Inhalt der Textdatei direkt in den Code kopieren, funktioniert es für mich richtig.

import random 

projNames = ['Apollo', 'Astro', 'Aurora', 'Barcelona'] 
print(random.choice(projNames)) 

Beispiel Ergebnis: Apollo

Ich brauche es in der Lage sein, den Inhalt der Datei in meiner .py Datei den Code direkt eher zu laden als bearbeiten.

Was habe ich in meinem ursprünglichen Code übersehen? Ich verwende speziell Python 2.7.x (neueste Version).

+0

Ihre 'projects.txt' Datei enthält eine Zeichenfolge mit dem Inhalt "[ 'Apollo', 'Astro', 'Aurora', 'Barcelona']"? – kvorobiev

+0

Versuchen Sie zuerst, es in eine Liste zu konvertieren, indem Sie 'projNames = eval (projNames)' – ayhan

+0

Nein, die Projektdatei enthält keine doppelten Anführungszeichen, die die gesamte Liste umgeben. –

Antwort

1

Sie kann json.loads nach dem Ersetzen von einfachen Anführungszeichen mit einem doppelten Anführungszeichen verwenden. Der Code wird wie folgt sein:

import random 
import json 

line = open('projects.txt').read().replace("'", '"') # Format JSON 
projNames = json.loads(line) # Load list 
print(random.choice(projNames)) 
+0

Beeindruckend! Könntest du mich ein wenig aufklären oder darauf hinweisen, warum es sicherer wäre als das 'Ast'-Modul? –

+1

@DanijelJ, Oh, ich habe gerade gelesen, dass' ast.literal_eval' alle notwendigen Sicherheitsprüfungen durchführt, damit es sicher verwendet werden kann Es persönlich mag ich jedoch nicht und vertraue eval-ähnliche Funktionen Anrufe und ich versuche, sie zu vermeiden, wenn es möglich ist .. – max

+1

Auch AST Baum zu bauen ist eine kostspielige Operation e checked und JSON Lösung ist dreimal schneller als AST one – max

1

Dies ist, weil die read Methode Ihre Datei als eine große Zeichenfolge statt list liest. Sie müssen den Ausgang des read Befehl analysieren (split durch Komma könnte für Sie arbeiten):

>>> my_string.split() 
['Apollo', 'Astro', 'Aurora', 'Barcelona'] 
2

Sie müssen \ eval Zeichenfolge analysieren, um es Python-Liste zu machen:

import ast 
import random 

projNames = ast.literal_eval(open('projects.txt').read()) 
print(random.choice(projNames)) 
+0

Dies ist einfach und funktioniert perfekt. Danke. Ich lese durch 'pydoc ast', um einen besseren Überblick zu bekommen. –

Verwandte Themen