2013-08-12 5 views
21

Sto usando Python 2.7.3 e sto scrivendo uno script che stampa i valori di byte esadecimale di qualsiasi file definito dall'utente. Funziona correttamente con un problema: ognuno dei valori viene stampato su una nuova riga. È possibile stampare i valori con spazi anziché nuove righe?Nuova riga in funzione python print()

Ad esempio, invece di

Posso avere '61 62' , invece?

Qui di seguito è il mio codice ('..txt' è un file che contiene il testo 'abcd'):

#!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 

risposta

35

Prima di tutto print non è una funzione in Python 2, si tratta di una dichiarazione .

Per sopprimere il ritorno a capo automatico aggiungere un trailing , (virgola). Ora verrà usato uno spazio invece di una nuova riga.

Demo:

print 1, 
print 2 

uscita:

1 2 

Oppure utilizzare Python 3 di print() function:

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

Come si può vedere chiaramente print() funzione è molto più potente come noi possibile specificare qualsiasi stringa t o essere usato come end piuttosto uno spazio fisso.

20

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.