Подтвердить что ты не робот

Новая строка в функции print() python

Я использую Python 2.7.3, и я пишу script, который печатает шестнадцатеричные байтовые значения любого пользовательского файла. Он работает правильно с одной проблемой: каждое из значений печатается на новой строке. Можно ли печатать значения с пробелами вместо новых строк?

Например, вместо

61

62

Могу ли я использовать '61 62 '?

Ниже мой код ( "..txt" - это файл, который содержит текст "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
4b9b3361

Ответ 1

Прежде всего print не является функцией в Python 2, это утверждение.

Чтобы подавить автоматическую новую строку, добавьте конечную , (запятую). Теперь вместо новой строки будет использоваться пробел.

Демо:

print 1,
print 2

выход:

1 2

Или используйте функцию Python 3 print():

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

Как вы можете видеть, функция print() намного эффективнее, так как мы можем указать любую строку, которая будет использоваться как end скорее фиксированное пространство.

Ответ 2

Это делает почти все, что вы хотите:

f = open('data.txt', 'rb')

while True:
    char = f.read(1)
    if not char: break
    print "{:02x}".format(ord(char)),

С созданным data.txt следующим образом:

f = open('data.txt', 'wb')
f.write("ab\r\ncd")
f.close()

Я получаю следующий вывод:

61 62 0d 0a 63 64

tl; dr - 1. Вы используете неправильные имена переменных. 2. Вы неправильно нарезаете свои шестнадцатеричные строки. 3. Ваш код никогда не заменит новые строки. Вы можете просто забыть об этой функции. Вы еще не совсем понимаете разницу между символом, его целым кодом и шестнадцатеричной строкой, представляющей целое число. Все они разные: две строки и одно целое, и ни один из них не равен друг другу. 4. Для некоторых файлов вы не должны удалять новые строки.

===

1. Ваши имена переменных ужасающи.

Это прекрасно, если вы никогда не захотите задавать какие-либо вопросы. Но так как каждый должен задавать вопросы, вам нужно использовать описательные имена переменных, которые любой может понять. Ваши имена переменных немного лучше, чем эти:

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

Эта программа работает нормально, но ее невозможно понять.

2. Функция hex() создает строки разной длины.

Например,

print hex(61)
print hex(15)

--output:--
0x3d
0xf

И взяв срез [-2:] для каждой из этих строк, вы получите:

3d
xf

Посмотрите, как вы получили "x" во втором? Срез:

[-2:] 

говорит, чтобы перейти к концу строки и создать резервную копию двух символов, а затем взять оставшуюся часть строки. Вместо этого возьмите срез, начиная с 3-х символов:

[2:]  

3. Ваш код никогда не заменит новые строки.

Предположим, что ваш файл имеет следующие два последовательных символа:

"\r\n"

Теперь вы читаете в первом символе "\ r" и преобразуете его в целое число ord ( "\ r" ), давая вам целое число 13. Теперь вы преобразовываете это в строку, hex (13), который дает вам строку "0xd", и вы отбрасываете первые два символа, которые дают вам:

"d"

Далее, эта строка в вашем коде:

bndtx.replace(entx, ' ')

пытается найти каждое вхождение строки "\r\n" в строке "d" и заменить ее. Никакой замены никогда не будет, потому что строка замены имеет длину два символа, а строка "d" - один символ.

Замена не будет работать для "\r\n" и "0d". Но по крайней мере сейчас есть вероятность, что он может работать, потому что обе строки имеют два символа. Позвольте свести обе строки к общему знаменателю: ascii-коды. Код ascii для "\ r" равен 13, а ascii-код для "\n" равен 10. Теперь как насчет строки "0d"? Код ascii для символа "0" равен 48, а код ascii для символа "d" равен 100. Эти строки не имеют общего символа. Даже это не работает:

 x = '0d' + '0a'
 x.replace("\r\n", " ")
 print x

 --output:--
 '0d0a'

И это не будет:

x = 'd' + 'a'
x.replace("\r\n", " ")
print x

--output:--
da

Суть заключается в следующем: преобразование символа в целое число, а затем в шестнадцатеричную строку не дает вам оригинального символа - это просто разные строки. Поэтому, если вы это сделаете:

char = "a"
code = ord(char)
hex_str = hex(code)

print char.replace(hex_str, " ")

... вы не можете ожидать, что "a" будет заменено пробелом. Если вы посмотрите здесь:

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'

Вы можете видеть, что "a" - это строка с одним символом в ней, а '0x61' - строка с 4 символами в ней: '0', 'x', '6' и '1', и вы никогда не сможете найти строку из четырех символов внутри одной символьной строки.

4) Удаление новых строк может испортить данные.

Для некоторых файлов вы не хотите заменять новые строки. Например, если вы читали файл .jpg, который представляет собой файл, содержащий кучу целых чисел, представляющих цвета на изображении, а некоторые цвета на изображении были представлены числом 13, за которым следует номер 10, ваш код удалит эти цвета с выхода.

Однако, если вы пишете программу для чтения только текстовых файлов, то замена новых строк прекрасна. Но тогда разные операционные системы используют разные новые строки. Вы пытаетесь заменить Windows newlines (\ r\n), что означает, что ваша программа не будет работать с файлами, созданными компьютером Mac или Linux, которые используют \n для новых строк. Есть простые способы решить это, но, возможно, вы еще не хотите об этом беспокоиться.

Я надеюсь, что все это не слишком запутывает.