2016-12-21 2 views
1

Ich bin ein Anfänger, der eine Datei liest, die nach Django hochgeladen wurde und Probleme beim Lesen von() und Splitlinien() mit der Datei hat.Django liest die hochgeladene Datei und iteriert über die Bytes

Klartextdatei sieht so aus.

04-05-2011 - 04-05-2012 
Something happened between these dates 
12-05-2015 - 14-03-2016 
We need to make some more money in this period. 

ich es in einer Django Ansicht wie diese bin Verarbeitung.

if file_form.is_valid(): 
    file = request.FILES['filename'].read() 
    print(type(file)) 
    for x in file: 
     print(x, type(x)) 

Diese Drucke Typ 'Bytes' und ein langer Strom von (Ascii) 'integer' Typen wie dieser ...

<class 'bytes'> 
48 <class 'int'> 
52 <class 'int'> 
45 <class 'int'> 
48 <class 'int'> 
53 <class 'int'> 
... 

Wenn ich hinzufügen .splitlines() nach dem Lesen der Datei ..

.
file = request.FILES['filename'].read().splitlines() 
print(type(file)) 
for x in file: 
     print(x, type(x)) 

dann bekomme ich den Typ 'Liste' und Zeilen der Typen statt 'Bytes' ...

<class 'list'> 
b'04-05-2011 - 04-05-2012' <class 'bytes'> 
b'Something happened between these dates' <class 'bytes'> 
b'12-05-2015 - 14-03-2016' <class 'bytes'> 
b'We need to make some more money in this period.' <class 'bytes'> 

Meine Frage ist, warum gibt der Ausdruck von .read() ascii Ganzzahlen während des Druckens zurück. Splitlines() gibt eine Liste von Bytes zurück?

ich habe, dass der Druck .lesen() vorgestellt ohne .splitlines() würde noch Bytes zurück, aber mit dem Newline '\ n' in dem Byte-String enthält ...

b'04-05-2011 - 04-05-2012\r\n' <class 'bytes'> 
... 

Antwort

1

Beachten Sie, dass in Ihrem Im ersten Beispiel drucken Sie nicht das Ergebnis read, aber das Ergebnis iteriert auf read().

file = request.FILES['filename'].read() # file is a 'bytes' object 
for x in file:# iterating on a bytes object produces integers 
    print(x, type(x)) 

Iterieren auf einem Objekt erzeugt bytes ganze Zahlen sind, wie in der documentation beschrieben.

Denn ein bytes Objekt ist ein interable auf „byte“ Objekte und ein Byte kann durch eine ganze Zahl in dem Bereich [0, 256 [Bereich dargestellt werden:

>>> print(bytes(range(0, 256))) 
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' 

Wenn Sie Zeichen drucken möchten anstelle von Ganzzahlen müssen Sie die Bytes mit der Funktion chr:

for x in file: 
    print(chr(x), type(chr(x)))# chr(x) is 'str' 
konvertieren
Verwandte Themen