python - 如何将文本文件中的十六进制行转换为数组(Python)?

标签 python numpy

我有一个文本文件,每行包含一个十六进制明文,我的文件如下所示:

7a8e5dc390781eab8df2c090bf4bebca
dbac0fba55d3d4fc177161bfe24dc7fb
82e5a7a021197f6fbe94a867d4bb3895
850580c1ffec887c5000c9b3a0e6b39d
1526af37ce4b0b4e81f8af0647e37119
bab19c53fd86e6afc933276b286e0c36
b52e53007bebe8877ce569ad2494dd76
44fd87e9b1a40a929ab6135665c22d0f
a88e5141ddc99e0207a9e144f4010a22
58ff597819ea0aa37024a1f1f84c5224

我需要将每一行转换为一个数组,我的意思是我的 numpy 文件必须如下所示:

[ 
[7a,8e,5d,c3,90,78,1e,ab,8d,f2,c0,90,bf,4b,eb,ca],[db,ac,0f,ba,55,d3,d4,fc,17,71,61,bf,e2,4d,c7,fb],

…………, ]

import numpy as np
In_path= "/home/msmache/Bureau/testPlaintext.txt"
Out_path= "/home/msmache/Bureau/testPlaintext.npy"

with open(In_path, "r") as In_f:
    all_arrays = []
    Plaintext=[]
    for line in In_f:
        Plaintext=['{:02x}'.format(b) for b in line]
        all_arrays.append(Plaintext)
    print all_arrays   
    with open(Out_path, "wb") as Out_f:
        np.save(Out_path, all_arrays)
data = np.load(Out_path)
print data

这是我遇到的错误:

 Plaintext=['{:02x}'.format(b) for b in line]
 ValueError: Unknown format code 'x' for object of type 'str'

最佳答案

Plaintext=['{:02x}'.format(b) for b in line] 无法工作,因为 for b in line 发出了该行的一个字符,而每次迭代都需要其中的 2 个。

此外,即使您这样做了,十六进制格式也适用于整数值,而不适用于字符串。

我创建 all_arrays 的建议:使用简单的列表切片双列表理解:

al_arrays = [[l[i:i+2] for i in range(0,len(l.strip()),2)] for l in In_f]

all_arrays 按预期产生:

[['7a', '8e', '5d', 'c3', '90', '78', '1e', 'ab', '8d', 'f2', 'c0', '90', 'bf',
  '4b', 'eb', 'ca'],
 ['db', 'ac', '0f', 'ba', '55', 'd3', 'd4', 'fc', '17', '71', '61', 'bf', 'e2',
  '4d', 'c7', 'fb'],
 ['82', 'e5', 'a7', 'a0', '21', '19', '7f', '6f', 'be', '94', 'a8', '67', 'd4',
  'bb', '38', '95'],
 ['85', '05', '80', 'c1', 'ff', 'ec', '88', '7c', '50', '00', 'c9', 'b3', 'a0',
  'e6', 'b3', '9d'],
 ['15', '26', 'af', '37', 'ce', '4b', '0b', '4e', '81', 'f8', 'af', '06', '47',
  'e3', '71', '19'],
 ['ba', 'b1', '9c', '53', 'fd', '86', 'e6', 'af', 'c9', '33', '27', '6b', '28',
  '6e', '0c', '36'],
 ['b5', '2e', '53', '00', '7b', 'eb', 'e8', '87', '7c', 'e5', '69', 'ad', '24',
  '94', 'dd', '76'],
 ['44', 'fd', '87', 'e9', 'b1', 'a4', '0a', '92', '9a', 'b6', '13', '56', '65',
  'c2', '2d', '0f'],
 ['a8', '8e', '51', '41', 'dd', 'c9', '9e', '02', '07', 'a9', 'e1', '44', 'f4',
  '01', '0a', '22'],
 ['58', 'ff', '59', '78', '19', 'ea', '0a', 'a3', '70', '24', 'a1', 'f1', 'f8',
  '4c', '52', '24']]

注意:如果您想要数值而不是十六进制字符串,只需转换为整数(以 16 为底)

al_arrays = [[int(l[i:i+2],16) for i in range(0,len(l.strip()),2)] for l in In_f]

你会得到类似的东西:

[[122, 142, 93, 195, 144, 120, 30, 171, 141, 242, 192, 144, 191, 75, 235, 202], [219, 172, 15, 186, 85, ...

不是十六进制,但二进制转换无所谓。

关于python - 如何将文本文件中的十六进制行转换为数组(Python)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42247607/

相关文章:

python - 如何、何时以及在 python 中向量化什么?

python - 如何制作一个连续包含 numpy 数组的另一个元素的循环以计算运行方差?

python - 使用 cv2 在 python 中创建多 channel 零垫

python - 更改 Airflow DAG 的执行并发

Python Regex bool 值 'or' 不选择所有匹配项

python - 我怎样才能得到损失的梯度Tensorflow 中的模型预测?

python - 将 NumPy 字符串数组映射为整数

python - 在 Django 中,如何在运行 syncdb 时从 SQL 文件创建表

python - 阅读文档构建失败,出现 "cannot import name ' PackageFinder' from 'pip._internal.index' ”

python - 用于分隔 numpy 数组的字典键和值