2010-03-30 16 views
9

Ho un documento di testo che contiene un elenco di numeri e voglio convertirlo in un elenco. In questo momento posso solo ottenere l'intera lista nella 0a voce della lista, ma voglio che ogni numero sia un elemento di una lista. Qualcuno sa di un modo semplice per farlo in Python?Conversione di una stringa in un elenco in Python

1000 
2000 
3000 
4000 

a

['1000','2000','3000','4000'] 
+3

Vuoi davvero '[ '1000', '2000', '3000', '4000']'? Forse '[1000,2000,3000,4000]' sarebbe meglio? –

+0

La tua domanda ammette troppe possibilità. Il file di testo contiene solo un elenco di numeri o è l'elenco in un contesto più ampio. Hai il controllo su come leggi dal documento o sei bloccato con la lettura di una stringa che contiene una serie di numeri di nuova riga o separati da spazi bianchi? I numeri nella lista sono sempre separati da nuove righe o sono a volte separati da altri spazi bianchi? Vuoi davvero una lista di stringhe come risultato, o una lista di interi va meglio? – Omnifarious

risposta

20

Per convertire una stringa Python in una lista utilizzare il metodo str.split:

>>> '1000 2000 3000 4000'.split() 
['1000', '2000', '3000', '4000'] 

split ha alcune opzioni: li guardare in alto per usi avanzati.

È anche possibile leggere il file in un elenco con il metodo readlines() di un oggetto file - restituisce un elenco di righe. Ad esempio, per ottenere un elenco di numeri interi da quel file, si può fare:

lst = map(int, open('filename.txt').readlines()) 

P.S: Vedi alcuni altri metodi per fare lo stesso nei commenti. Alcuni di questi metodi sono più belli (più Pythonic) dei miei

+1

stai usando 'str.split', non' string.split', quest'ultimo è comunque obsoleto. – SilentGhost

+0

@SilentGhost: errore di battitura, grazie per aver notato –

+2

Gli oggetti file sono iterabili, quindi raramente c'è un motivo per usare il metodo 'readlines'. Ad esempio, potresti ottenere gli stessi risultati dell'ultimo snippet con 'map (int, open ('filename.txt'))'. –

1
>>> open("myfile.txt").readlines() 
>>> lines = open("myfile.txt").readlines() 
>>> lines 
['1000\n', '2000\n', '3000\n', '4000\n'] 
>>> clean_lines = [x.strip() for x in lines] 
>>> clean_lines 
['1000', '2000', '3000', '4000'] 

Oppure, se si dispone già di una stringa, utilizzare str.split:

>>> myfile 
'1000\n2000\n3000\n4000\n' 
>>> myfile.splitlines() 
['1000', '2000', '3000', '4000', ''] 

È possibile rimuovere l'elemento vuoto con una lista di comprensione (o semplicemente un ciclo regolare for)

>>> [x for x in myfile.splitlines() if x != ""] 
['1000', '2000', '3000', '4000'] 
+1

usa 's.splitlines()', non 's.split (" \ n ")' –

0

Potrebbe essere necessario rimuovere i newline.

# list of strings 
[number for number in open("file.txt")] 

# list of integers 
[int(number) for number in open("file.txt")] 
+0

E, se l'OP avesse bisogno di spogliare i newline, come apparirebbe quel codice? – Omnifarious

+0

Puoi anche usare semplicemente la lista 'list' al posto di una lista di comprensione -' list (open ("myfile.txt")) '->' ['1000 \ n', '2000 \ n', '3000 \ n ',' 4000 \ n '] ' – dbr

+0

@dbr:' .readlines() 'potrebbe essere un'opzione migliore. – SilentGhost

1
$ cat > t.txt 
    1 
    2 
    3 
    4 
    ^D 
    $ python 
    Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51) 
    [GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>> l = [l.strip() for l in open('t.txt')] 
    >>> l 
    ['1', '2', '3', '4'] 
    >>> 
+1

non è necessario fare' .readlines() '! – SilentGhost

+0

vero. rimosso ora, grazie per averlo indicato! – rytis

1
with open('file.txt', 'rb') as f: 
     data = f.read() 
    lines = [s.strip() for s in data.split('\n') if s] 
Problemi correlati