Dies ist fast alles, was Sie wollen:
f = open('data.txt', 'rb')
while True:
char = f.read(1)
if not char: break
print "{:02x}".format(ord(char)),
Mit data.txt wie folgt erstellt:
f = open('data.txt', 'wb')
f.write("ab\r\ncd")
f.close()
ich die folgende Ausgabe:
61 62 0d 0a 63 64
tl; dr - 1. Sie verwenden schlechte Variablennamen. 2. Sie schneiden Ihre Hex-Strings falsch. 3. Ihr Code ersetzt niemals Zeilenumbrüche. Vielleicht möchten Sie diese Funktion einfach vergessen. Sie kennen den Unterschied zwischen einem Zeichen, seinem ganzzahligen Code und der hexadezimalen Zeichenfolge, die die Ganzzahl darstellt, noch nicht ganz. Sie sind alle verschieden: zwei sind Strings und einer ist eine ganze Zahl, und keiner von ihnen ist gleich zueinander. 4. Bei einigen Dateien sollten Sie keine Zeilenumbrüche entfernen.
===
1. Ihre Variablennamen horrend sind.
Das ist in Ordnung, wenn Sie nie jemand Fragen stellen möchten. Aber da jeder Fragen stellen muss, müssen Sie beschreibende Variablennamen verwenden, die jeder verstehen kann.Ihre Variablennamen sind nur geringfügig besser als diese:
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
Dieses Programm läuft gut, aber es ist unmöglich zu verstehen.
2. Die Funktion hex() erzeugt Strings unterschiedlicher Länge.
Zum Beispiel
print hex(61)
print hex(15)
--output:--
0x3d
0xf
Und die Scheibe unter [-2:] für jede dieser Zeichenketten gibt Ihnen:
3d
xf
Sehen Sie, wie Sie das 'x' in der zweiten bekam ein? Die Scheibe:
[-2:]
sagt zum Ende der Zeichenfolge zu gehen und zwei Zeichen zu sichern, dann den Rest der Saite greifen. Statt das zu tun, nehmen Sie die Scheibe ab dem 3. Zeichen von Anfang an:
[2:]
3. Ihr Code wird nie Zeilenumbrüche ersetzen.
Dateien Angenommen, hat diese zwei aufeinanderfolgende Zeichen:
"\r\n"
Jetzt lesen Sie in dem ersten Zeichen "\ r", und wandelt es in einer ganzen Zahl, ord ("\ r"), mit Sie die ganze Zahl 13. Jetzt konvertieren Sie, dass in einen String, hex (13), mit dem Sie die Zeichenfolge "0xd"
, und Sie abschneiden die ersten beiden Zeichen geben Ihnen gibt:
"d"
Als nächstes diese Zeile im Code :
versucht, jedes Vorkommen der Zeichenfolge "\r\n"
in der Zeichenfolge "d"
zu finden und zu ersetzen. Es wird nie eine Ersetzung geben, da die Ersetzungszeichenfolge zwei Zeichen lang ist und die Zeichenfolge "d"
ein Zeichen lang ist.
Die Ersetzung funktioniert auch nicht für "\r\n"
und "0d"
. Aber zumindest jetzt gibt es eine Möglichkeit, dass es funktionieren könnte, weil beide Zeichenfolgen zwei Zeichen haben. Lassen Sie uns beide Strings auf einen gemeinsamen Nenner bringen: ASCII-Codes. Der ASCII-Code für "\ r" ist 13, und der ASCII-Code für "\ n" ist 10. Was ist nun mit der Zeichenfolge "0d"
? Der ASCII-Code für das Zeichen"0"
ist 48, und der ASCII-Code für das Zeichen "d" ist 100. Diese Zeichenfolgen haben kein einzelnes Zeichen gemeinsam. Auch funktioniert das nicht:
x = '0d' + '0a'
x.replace("\r\n", " ")
print x
--output:--
'0d0a'
Auch wird dies:
x = 'd' + 'a'
x.replace("\r\n", " ")
print x
--output:--
da
Unterm Strich ist: dann zu einem Hex-String ein Zeichen in eine ganze Zahl konvertieren nicht beenden Sie den ursprünglichen Charakter zu geben - Sie sind nur verschiedene Saiten.Also wenn Sie das tun:
char = "a"
code = ord(char)
hex_str = hex(code)
print char.replace(hex_str, " ")
... können Sie nicht erwarten, dass "a" durch ein Leerzeichen ersetzt wird. Wenn Sie die Ausgabe hier untersuchen:
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'
Sie können sehen, dass 'a' eine Zeichenkette mit einem Zeichen in ihm ist, und '0x61'
ist eine Zeichenkette mit 4 Zeichen in es: '0'
, 'x'
, '6'
und '1'
, und Sie können nie eine Zeichenfolge mit vier Zeichen innerhalb einer Zeichenfolge finden.
4) Das Entfernen von Zeilenumbrüchen kann die Daten beschädigen.
Bei einigen Dateien möchten Sie keine Zeilenumbrüche ersetzen. Wenn Sie zum Beispiel in einer .jpg-Datei lesen, die eine Reihe von Ganzzahlen enthält, die Farben in einem Bild darstellen, und einige Farben im Bild zufällig durch die Zahl 13 gefolgt von der Zahl 10 dargestellt werden, wird Ihre Code würde diese Farben aus der Ausgabe entfernen.
Wenn Sie jedoch ein Programm zum Lesen von nur Text Dateien schreiben, dann ist das Ersetzen von Zeilenumbrüchen in Ordnung. Verschiedene Betriebssysteme verwenden jedoch unterschiedliche Zeilenumbrüche. Sie versuchen, Windows-Zeilenumbrüche (\ r \ n) zu ersetzen, was bedeutet, dass Ihr Programm nicht mit Dateien arbeitet, die von einem Mac- oder Linux-Computer erstellt wurden, der \ n für Zeilenumbrüche verwendet. Es gibt einfache Wege, das zu lösen, aber vielleicht möchten Sie sich darüber noch keine Gedanken machen.
Ich hoffe, dass all das nicht zu verwirrend ist.