Python将每两个字符之间添加空格。

4

我希望修改一个包含十六进制转储的文件。有33行字符串如下:

0000000000000000b00b8000c7600795
0001906da451000000008fac0b000000

我想在每两个字符后面放置两个空格,就像这样:

00 00 00 00 00 00 00 00 b0 0b 80 00 c7 60 07 95

到目前为止,我已经编写了这个脚本,它可以运行,但是每个字符之间都有两个空格。我无法确定在.join()中需要使用什么参数才能使其每两个字符为一组。
import os

os.rename( 'hex_dump.txt', 'hex_dump.old' )

destination = open( 'hex_dump.txt', "w" )
source = open( 'hex_dump.old', "r" )
for line in source:
    if len(line) > 2:
        destination.write("  ".join(line))
source.close()
destination.close()
4个回答

2
假设您有一个名为hex_dump.txt的文件,其内容如下:
0000000000000000b00b8000c7600795
0001906da451000000008fac0b000000

你可以使用 str.join 方法:
#!/usr/bin/python3.9

import os

os.rename('hex_dump.txt', 'hex_dump.old')

with open('hex_dump.txt', 'w') as dest, open('hex_dump.old', 'r') as src:
    for line in src:
        if len(line) > 2:
            dest.write(' '.join(line[i:i + 2] for i in range(0, len(line), 2)))

hex_dump.txt在执行以上操作后的结果:

00 00 00 00 00 00 00 00 b0 0b 80 00 c7 60 07 95 
00 01 90 6d a4 51 00 00 00 00 8f ac 0b 00 00 00

谢谢您的答复。在发布此帖子之前,我已经尝试过以下代码:line[i:i+2] for i in range(0, len(line), 2) - Rescor

1
你可以将字符串分成大小为2的子字符串,并在空格上重新连接生成的子字符串:
def chunks(lst, n):
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

def split_string(s):
    return " ".join(chunks(s, n=2))

0
你可以将文件作为二进制输入读取,然后将每个字节用空格分隔写入目标文件中:
with open ('hex_dump.old', 'rb') as f1:
    with open('hex_dump.txt', 'wb') as f2:
        in_byte= f1.read(1)
        while in_byte!= b"":
            f2.write(in_byte)
            f2.write(' '.encode())
        

0

答案:

您可以使用索引的奇偶性生成一个列表推导式,并在其上执行连接操作。

"".join([e + " " if i % 2 else e for i, e in enumerate("0001906da451000000008fac0b000000")])

将字符串"0001906da451000000008fac0b000000"替换为您的变量line


时间分析:

line = "0001906da451000000008fac0b000000" * 1000000
import time
t0 = time.time()
"".join([e + " " if i % 2 else e for i, e in enumerate(line)])
print('"".join([e + " " if i % 2 else e for i, e in enumerate(line)])' + str(time.time() - t0) + " s")
' '.join(line[i:i + 2] for i in range(0, len(line), 2))
print('" ".join(line[i:i + 2] for i in range(0, len(line), 2))' + str(time.time() - t0) + " s")

结果:

"".join([e + " " if i % 2 else e for i, e in enumerate(line)])     3.010514974594116 s
" ".join(line[i:i + 2] for i in range(0, len(line), 2))     5.175166130065918 s

结论:
我的方法是最快的!

1
这不是一种严格的基准测试方法,因此您的结论并不好。使用%timeit,我可以看到第二种方法在7次运行中平均快20%。 - erip
也许是,但这不是我问题的重点。 - Rescor
在您的脚本中替换if len(line) > 2: destination.write(" ".join(line))为我的答案中的脚本... - Vincent Bénet
@erip 我会看一下,谢谢! - Vincent Bénet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接