variable - python print carriage return no line feed
Nueva línea en la función print() de python (2)
En primer lugar, la print
no es una función en Python 2, es una declaración.
Para suprimir la nueva línea automática, agregue un final ,
(coma). Ahora se usará un espacio en lugar de una nueva línea.
Manifestación:
print 1,
print 2
salida:
1 2
O use la función print()
Python 3:
from __future__ import print_function
print(1, end='' '') # default value of `end` is ''/n''
print(2)
Como se puede ver claramente, la función print()
es mucho más poderosa, ya que podemos especificar cualquier cadena que se use como un end
lugar de un espacio fijo.
Estoy usando Python 2.7.3 y estoy escribiendo un script que imprime los valores de bytes hexadecimales de cualquier archivo definido por el usuario. Está funcionando correctamente con un problema: cada uno de los valores se imprime en una nueva línea. ¿Es posible imprimir los valores con espacios en lugar de nuevas líneas?
Por ejemplo, en lugar de
61
62
Me gustaría tener 61 62
.
A continuación se encuentra mi código ( ..txt
es un archivo que contiene el texto ''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
Esto hace casi todo lo que quieres:
f = open(''data.txt'', ''rb'')
while True:
char = f.read(1)
if not char: break
print "{:02x}".format(ord(char)),
Con data.txt creado de esta manera:
f = open(''data.txt'', ''wb'')
f.write("ab/r/ncd")
f.close()
Me sale el siguiente resultado:
61 62 0d 0a 63 64
tl; dr - 1. Estás usando nombres de variables pobres. 2. Estás cortando incorrectamente las cadenas de tu hex. 3. Su código nunca reemplazará ninguna nueva línea. Es posible que desee olvidarse de esa característica. Aún no entiendes la diferencia entre un carácter, su código de entero y la cadena hexadecimal que representa el entero. Todos son diferentes: dos son cadenas y una es un número entero, y ninguna de ellas es igual a la otra. 4. Para algunos archivos, no debe eliminar nuevas líneas.
===
1. Sus nombres de variables son horrendos.
Eso está bien si nunca quieres hacer preguntas a nadie. Pero como cada una necesita hacer preguntas, debe usar nombres de variables descriptivas que cualquiera pueda entender. Sus nombres de variables son solo ligeramente mejores que estos:
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
Ese programa funciona bien, pero es imposible de entender.
2. La función hex () produce cadenas de diferentes longitudes.
Por ejemplo,
print hex(61)
print hex(15)
--output:--
0x3d
0xf
Y tomar la división [-2:] para cada una de esas cadenas te da:
3d
xf
¿Ves cómo conseguiste la ''x'' en la segunda? La rebanada
[-2:]
dice que ir al final de la cadena y hacer una copia de seguridad de dos caracteres, luego agarrar el resto de la cadena. En lugar de hacer eso, toma la división que comienza con 3 caracteres desde el principio:
[2:]
3. Su código nunca reemplazará ninguna nueva línea.
Supongamos que su archivo tiene estos dos caracteres consecutivos:
"/r/n"
Ahora lee el primer carácter, "/ r", y lo convierte en un entero, ord ("/ r"), que le da el entero 13. Ahora lo convierte en una cadena, hex (13), que le da la cadena "0xd"
, y corta los dos primeros caracteres para obtener:
"d"
A continuación, esta línea en su código:
bndtx.replace(entx, '' '')
intenta encontrar cada aparición de la cadena "/r/n"
en la cadena "d"
y reemplazarla. Nunca habrá ningún reemplazo porque la cadena de reemplazo tiene una longitud de dos caracteres y la cadena "d"
tiene una longitud de un carácter.
El reemplazo no funcionará para "/r/n"
y "0d"
tampoco. Pero al menos ahora existe la posibilidad de que funcione porque ambas cadenas tienen dos caracteres. Reduzcamos ambas cadenas a un denominador común: códigos ascii. El código ascii para "/ r" es 13, y el código ascii para "/ n" es 10. Ahora, ¿qué pasa con la cadena "0d"
? El código ascii para el carácter "0"
es 48, y el código ascii para el carácter "d" es 100. Esas cadenas no tienen un solo carácter en común. Incluso esto no funciona:
x = ''0d'' + ''0a''
x.replace("/r/n", " ")
print x
--output:--
''0d0a''
Tampoco esto:
x = ''d'' + ''a''
x.replace("/r/n", " ")
print x
--output:--
da
La línea de fondo es: convertir un carácter en un entero y luego en una cadena hexadecimal no le da el carácter original, solo son cadenas diferentes. Así que si haces esto:
char = "a"
code = ord(char)
hex_str = hex(code)
print char.replace(hex_str, " ")
... no se puede esperar que "a" sea reemplazada por un espacio. Si examinas la salida aquí:
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''
Puede ver que ''a'' es una cadena con un carácter, y ''0x61''
es una cadena con 4 caracteres: ''0''
, ''x''
, ''6''
y ''1''
, y nunca podrá encuentra una cadena de cuatro caracteres dentro de una cadena de un carácter.
4) La eliminación de nuevas líneas puede corromper los datos.
Para algunos archivos, no desea reemplazar nuevas líneas. Por ejemplo, si estaba leyendo en un archivo .jpg, que es un archivo que contiene un grupo de enteros que representan colores en una imagen, y que algunos colores en la imagen están representados por el número 13 seguido del número 10, El código eliminaría esos colores de la salida.
Sin embargo, si está escribiendo un programa para leer solo archivos de texto , entonces está bien reemplazar las nuevas líneas. Pero entonces, diferentes sistemas operativos utilizan diferentes líneas nuevas. Está intentando reemplazar las nuevas líneas de Windows (/ r / n), lo que significa que su programa no funcionará en los archivos creados por una computadora Mac o Linux, que usan / n para las nuevas líneas. Hay maneras fáciles de resolver eso, pero tal vez todavía no quiera preocuparse por eso.
Espero que todo eso no sea demasiado confuso.