2013-08-12 5 views
21

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

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

Могу ли я иметь '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 

ответ

35

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

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

Демо:

print 1, 
print 2 

выход:

1 2 

Или использовать Python 3-х print() function:

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

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

20

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

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 

ТЛ; др - 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 

Посмотрите, как вы получили 'х' во втором один? Срез:

[-2:] 

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

[2:] 

3. Ваш код никогда не заменит любой символ новой строки.

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

"\r\n" 

Теперь вы читаете в первый символ «\ г», и преобразовать его в целое число, Ord («\ г»), что дает вы целое число 13. Теперь вы преобразовать, что в строку, шестнадцатеричный (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, " ") 

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

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' 

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

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

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

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

Надеюсь, все это не слишком смущает.

Смежные вопросы