Questo fa quasi tutto quello che vuoi:
f = open('data.txt', 'rb')
while True:
char = f.read(1)
if not char: break
print "{:02x}".format(ord(char)),
Con data.txt creato in questo modo:
f = open('data.txt', 'wb')
f.write("ab\r\ncd")
f.close()
ottengo il seguente output:
61 62 0d 0a 63 64
tl; dr - 1. Si stanno utilizzando nomi di variabili poveri. 2. Stai tagliando le tue stringhe esadecimali in modo errato. 3. Il tuo codice non sostituirà mai le newline. Potresti semplicemente voler dimenticare questa funzione. Non si capisce ancora la differenza tra un personaggio, il suo codice intero e la stringa esadecimale che rappresenta il numero intero. Sono tutti diversi: due sono stringhe e uno è un numero intero, e nessuno di loro è uguale l'uno all'altro. 4. Per alcuni file, non è necessario rimuovere i newline.
===
1. I vostri nomi delle variabili sono terribili.
Va bene se non si vuole mai fare domande a nessuno. Ma dal momento che ognuno deve fare domande, è necessario utilizzare nomi di variabili descrittivi che tutti possano comprendere.I nomi delle variabili sono leggermente migliori di questi:
fname = 'data.txt'
f = open(fname, 'rb')
xxxyxx = f.read()
xxyxxx = len(xxxyxx)
print "Length of file is", xxyxxx, "bytes. "
yxxxxx = 0
while yxxxxx < xxyxxx:
xyxxxx = hex(ord(xxxyxx[yxxxxx]))
xyxxxx = xyxxxx[-2:]
yxxxxx = yxxxxx + 1
xxxxxy = chr(13) + chr(10)
xxxxyx = str(xxxxxy)
xyxxxxx = str(xyxxxx)
xyxxxxx.replace(xxxxyx, ' ')
print xyxxxxx
Quel programma funziona bene, ma è impossibile capire.
2. La funzione hex() produce stringhe di lunghezze diverse.
Per esempio,
print hex(61)
print hex(15)
--output:--
0x3d
0xf
E prendendo la fetta [-2:]:
3d
xf
Guarda come hai ottenuto la 'x' nella seconda di ciascuna di queste stringhe ti dà uno? La fetta:
[-2:]
dice di andare alla fine della stringa ed eseguire il backup di due caratteri, poi prendete il resto della stringa. Invece di fare questo, prendere la fetta di partenza 3 personaggi in fin dall'inizio:
[2:]
3. Il codice non potrà mai sostituire le nuove righe.
Supponiamo che il vostro file ha questi due caratteri consecutivi:
"\r\n"
Ora si legge nel primo carattere, "\ r", e convertirlo in un intero, ord ("\ r"), dando si il numero intero 13. Ora si converte in una stringa che, hex (13), che vi dà la stringa "0xd"
, e tagliare fuori i primi due caratteri dandovi:
"d"
Avanti, questa riga nel codice :
bndtx.replace(entx, ' ')
cerca di trovare ogni occorrenza della stringa "\r\n"
nella stringa "d"
e sostituirlo. Non ci sarà mai alcuna sostituzione perché la stringa di sostituzione è lunga due caratteri e la stringa "d"
è lunga un carattere.
La sostituzione non funzionerà per "\r\n"
e "0d"
. Ma almeno ora c'è una possibilità che potrebbe funzionare perché entrambe le stringhe hanno due caratteri. Riduciamo entrambe le stringhe a un denominatore comune: i codici ascii. Il codice ASCII per "\ r" è 13 e il codice ASCII per "\ n" è 10. Ora che ne è della stringa "0d"
? Il codice ASCII per il carattere "0"
è 48 e il codice ASCII per il carattere "d" è 100. Queste stringhe non hanno un singolo carattere in comune. Anche questo non funziona:
x = '0d' + '0a'
x.replace("\r\n", " ")
print x
--output:--
'0d0a'
Né questo:
x = 'd' + 'a'
x.replace("\r\n", " ")
print x
--output:--
da
La linea di fondo è: la conversione di un personaggio in un intero poi ad una stringa esadecimale non finisce dando il carattere originale - sono solo stringhe diverse.Quindi, se lo fai:
char = "a"
code = ord(char)
hex_str = hex(code)
print char.replace(hex_str, " ")
... non puoi aspettarti che "a" sia sostituito da uno spazio. Se si esamina l'output qui:
char = "a"
print repr(char)
code = ord(char)
print repr(code)
hex_str = hex(code)
print repr(hex_str)
print repr(
char.replace(hex_str, " ")
)
--output:--
'a'
97
'0x61'
'a'
si può vedere che 'a' è una stringa con un carattere in esso e '0x61'
è una stringa con 4 caratteri in esso: '0'
, 'x'
, '6'
, e '1'
, e non puoi mai trovare una stringa di quattro caratteri all'interno di una stringa di un solo carattere.
4) La rimozione di newline può danneggiare i dati.
Per alcuni file, non si desidera sostituire le nuove. Ad esempio, se stai leggendo in un file .jpg, che è un file che contiene un mucchio di numeri interi che rappresentano i colori in un'immagine, e alcuni colori nell'immagine sono stati rappresentati dal numero 13 seguito dal numero 10, il tuo il codice eliminerebbe quei colori dall'output.
Tuttavia, se si sta scrivendo un programma per leggere solo testo file, la sostituzione di newline va bene. Ma poi, i diversi sistemi operativi utilizzano newline differenti. Stai tentando di sostituire Windows newline (\ r \ n), il che significa che il tuo programma non funzionerà su file creati da un computer Mac o Linux, che usa \ n per newline. Ci sono modi semplici per risolverlo, ma forse non vuoi ancora preoccupartene.
Spero che tutto ciò non sia troppo confuso.