30

我正在使用 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
4

2 回答 2

44

首先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固定空间的任何字符串。

于 2013-08-12T04:39:16.187 回答
24

这几乎可以满足您的所有需求:

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 代码。“\r”的ASCII码是13,“\n”的ASCII码是10。那么字符串"0d"呢?字符 的 ascii 代码"0"是 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''6''1',并且你永远无法在一个字符串中找到四个字符的字符串。

4) 删除换行符会损坏数据。

对于某些文件,您不想替换换行符。例如,如果您正在读取 .jpg 文件,该文件包含一堆表示图像中颜色的整数,并且图像中的某些颜色恰好由数字 13 后跟数字 10 表示,您的代码会从输出中消除这些颜色。

但是,如果您正在编写一个只读取文本文件的程序,那么替换换行符就可以了。但是,不同的操作系统使用不同的换行符。您正在尝试替换 Windows 换行符 (\r\n),这意味着您的程序无法处理由 Mac 或 Linux 计算机创建的文件,这些文件使用 \n 表示换行符。有一些简单的方法可以解决这个问题,但也许你还不想担心这个问题。

我希望这一切都不会太混乱。

于 2013-08-12T05:11:41.480 回答