我正在使用Python 2.7.3,我正在编写一个脚本,用于打印任何用户定义文件的十六进制字节值。它正在解决一个问题:每个值都打印在一个新行上。是否可以使用空格而不是新行打印值?
例如,而不是
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
答案 0 :(得分:39)
首先,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()
函数更强大,因为我们可以指定要用作end
的任何字符串而不是固定空格。
答案 1 :(得分:21)
这几乎可以满足您的一切需求:
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"
现在你读入第一个字符“\ _”,并将它转换为整数ord(“\ r”),给你整数13.现在你将它转换为字符串,hex(13),它为你提供了字符串"0xd"
,你切掉了给你的前两个字符:
"d"
接下来,代码中的这一行:
bndtx.replace(entx, ' ')
尝试在字符串"\r\n"
中查找字符串"d"
的每次出现并替换它。永远不会有任何替换,因为替换字符串是两个字符长,字符串"d"
是一个字符长。
替换不适用于"\r\n"
和"0d"
。但至少现在有可能它可以工作,因为两个字符串都有两个字符。让我们将两个字符串减少到一个共同点:ascii代码。 “\ r”的ascii代码是13,“\ n”的ascii代码是10.现在字符串"0d"
怎么样? 字符 "0"
的ascii代码为48,字符“d”的ascii代码为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'
,{{1} }和'6'
,你永远不会在一个字符串中找到一个四个字符的字符串。
4)删除换行符可能会破坏数据。
对于某些文件,您不希望替换换行符。例如,如果您正在读取.jpg文件,该文件包含一组表示图像颜色的整数,并且图像中的某些颜色恰好由数字13后跟数字10表示,则代码将从输出中消除这些颜色。
但是,如果您正在编写程序以只读取文本文件,那么替换换行就可以了。但是,不同的操作系统使用不同的换行符。您正在尝试替换Windows换行符(\ r \ n),这意味着您的程序将无法处理由Mac或Linux计算机创建的文件,这些文件使用\ n作为换行符。有很简单的方法可以解决这个问题,但也许你现在还不想担心。
我希望所有这些都不会太混乱。