2013-08-12 17 views
21

Ich benutze Python 2.7.3 und ich schreibe ein Skript, das die Hex-Byte-Werte einer benutzerdefinierten Datei druckt. Es funktioniert ordnungsgemäß mit einem Problem: Jeder der Werte wird in einer neuen Zeile gedruckt. Ist es möglich, die Werte mit Leerzeichen anstatt mit neuen Zeilen zu drucken?Neue Zeile in Python print() Funktion

Zum Beispiel statt

Kann ich '61 62' statt?

Unten ist mein Code ('..txt' ist eine Datei, die den Text 'ABCD' enthält):

#!usr/bin/python 
import os 
import sys 
import time 

filename = raw_input("Enter directory of the file you want to convert: ") 

f = open(filename, 'rb') 
fldt = f.read() 
lnfl = len(fldt) 
print "Length of file is", lnfl, "bytes. " 
orck = 0 
while orck < lnfl: 
    bndt = hex(ord(fldt[orck])) 
    bndt = bndt[-2:] 
    orck = orck + 1 
    ent = chr(13) + chr(10) 
    entx = str(ent) 
    bndtx = str(bndt) 
    bndtx.replace(entx, ' ') 
    print bndtx 

Antwort

35

Zu allererst print ist nicht eine Funktion in Python 2 ist es eine Aussage .

Um die automatische Zeilenumschaltung zu unterdrücken, fügen Sie eine nachgestellte , (Komma) hinzu. Jetzt wird ein Leerzeichen anstelle eines Zeilenumbaus verwendet.

Demo:

print 1, 
print 2 

Ausgang:

1 2 

Oder verwenden Python 3 des print() function:

from __future__ import print_function 
print(1, end=' ') # default value of `end` is '\n' 
print(2) 

Wie man deutlich sehen kann print() Funktion als wir viel mächtiger ist kann eine beliebige Zeichenfolge t angeben o als end eher ein fester Platz verwendet werden.

20

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.