2016-04-07 28 views
1

Ich habe eine Textdatei, „blah.txt“ und in ihm enthält diese Daten erkennen:eine Liste aus einer Textdatei

blah1: [01,02,03]

blah2: [01,02,03]

Ich kann durch die Datei lesen und in einer Liste damit abfinden:

reader = csv.reader(open('blah.txt'),delimiter=":") 

Aber [01,02,03] wird nicht als Liste, sondern als String erkannt. Gibt es einen kurzen und einfachen Weg, es so zu machen, dass es es als Liste erkennt?

Voll Code:

import csv, operator 
reader = csv.reader(open('file.txt'),delimiter=":") 
sortedlist = sorted(reader, reverse=True) 
for name, score in sortedlist: 
    print(score) 

Edit:

I

blah1:010203

blah2:010203

die Daten als stattdessen schreiben und verwenden diese:

import csv, operator 
reader = csv.reader(open('file.txt'),delimiter=":") 
sortedlist = sorted(reader, reverse=True) 
for name, score in sortedlist: 
    score = [int(score[i:i+2]) for i in range(0, len(score), 2)] 
    print(name, score) 

Es ist jedoch nicht bequem, direkt aus der Textdatei zu lesen (nach Personen).

+0

hässliche Version sein könnte 'json.loads (score)' – Torxed

+0

@Torxed, ich bin nicht ganz sicher, was das bedeutet? –

+0

Es wird eine Zeichenkette "[1,2,3]" genommen und in ein tatsächliches Listenobjekt konvertiert, da es sich um ein JSON akzeptiertes Format handelt. JSON ist eine Art Protokoll/Variablentyp – Torxed

Antwort

0

Angenommen, Sie haben "[01,02,03]" als String-Variable s gespeichert. Sie können dann tun:

score = [int(x) for x in s.strip('[').strip(']').split(',')] 

solange keine Leerzeichen zwischen den Klammern sind.

1

Zuerst dachte ich, ast.literal_eval das richtige Werkzeug dafür war, aber schauen, was passiert:

>>> literal_eval('[01,020,03]') 
[1, 16, 3] 

Da Sie wahrscheinlich ganze Zahlen beginnend mit Null nicht will 8 in der Basis zu interpretieren, kann ich nicht denke, es gibt eine viel schönere Lösung ist als durch Komma zu trennen:

>>> s = '[01,020,03]' 
>>> [int(x) for x in s[1:-1].split(',')] 
[1, 20, 3] 

Wenn Sie eine Chance haben, Ihre ganzen Zahlen ohne Nullen zu Ihrer Datei führt, ast.literal_eval gewinnt wieder zu schreiben.

+0

Dies ist offensichtlich eine viel besser lesbare Lösung. –

+0

Ich stoße auf einen SyntaxError: Ungültiges Token (sorry, Amateur hier) Edit: Ich realisiere es, weil die Zahlen als oktale Zahlen gesehen werden, eine Möglichkeit, dies zu verhindern? –

+0

@PandaGod eine Chance, dass Sie versehentlich die ganze Zeile und nicht nur die "Stringlist" Teil davon verwenden? – timgeb

0

Der Eingang (line.txt):

blah1: [01,02,03] 
blah2: [01,02,03] 
blah3: [01,02,03] 
blah4: [01,02,03] 

Prozess die Datei:

from collections import OrderedDict # if you want to maintain the order 

data = OrderedDict() 

for line in open("list.txt").readlines(): 
    k, v = line.split(':') 
    # from list (in string form), remove whitespace, remove brackets 
    # turn the list (in string form) into a list 
    data[k] = v.strip()[1:-1].split(',') 

Das Ergebnis:

>>> data 
OrderedDict([('blah1', ['01', '02', '03']), ('blah2', ['01', '02', '03']), 
('blah3', ['01', '02', '03']), ('blah4', ['01', '02', '03'])]) 
0

Dies ist, was ich am Ende mit, dank @ Timgeb für den Vorschlag.

reader = csv.reader(open(file + '.txt'),delimiter=":") 
data = {} 
for name, score in reader: 
    data[name] = sorted(ast.literal_eval(score), reverse=True) 
Verwandte Themen