我正在编写一个脚本,它会将另一个python脚本分解为块并使用pycrypto加密块(所有这些我到目前为止已成功完成),现在我将加密块存储到文件中,以便decrypter可以读取它并执行每个块。加密的最终结果是二进制输出列表(类似blocks=[b'\xa1\r\xa594\x92z\xf8\x16\xaa',b'xfbI\xfdqx|\xcd\xdb\x1b\xb3',etc...]
)。
当将输出写入文件时,它们都会变成一条巨行,这样当读取文件时,所有字节都会返回到一个巨行,而不是原始列表中的每个项目。我也尝试将字节转换为字符串,并在每个字符串的末尾添加'\n'
,但问题是我仍然需要字节,我无法弄清楚如何将字符串撤消到得到原始字节。
总结一下,我希望:将每个二进制项写入文件中的单独行,这样我就可以轻松读取数据并在解密中使用它,或者我可以将数据转换为字符串并在decrpytion撤消字符串以获取原始二进制数据。
以下是写入文件的代码:
new_file = open('C:/Python34/testfile.txt','wb')
for byte_item in byte_list:
# This or for the string i just replaced wb with w and
# byte_item with ascii(byte_item) + '\n'
new_file.write(byte_item)
new_file.close()
并且用于阅读文件:
# Or 'r' instead of 'rb' if using string method
byte_list = open('C:/Python34/testfile.txt','rb').readlines()
答案 0 :(得分:1)
文件是一个没有任何隐含结构的字节流。如果要加载二进制blob列表,则应存储一些其他元数据以恢复结构,例如,use the netstring format:
#!/usr/bin/env python
blocks = [b'\xa1\r\xa594\x92z\xf8\x16\xaa', b'xfbI\xfdqx|\xcd\xdb\x1b\xb3']
# save blocks
with open('blocks.netstring', 'wb') as output_file:
for blob in blocks:
# [len]":"[string]","
output_file.write(str(len(blob)).encode())
output_file.write(b":")
output_file.write(blob)
output_file.write(b",")
回读:
#!/usr/bin/env python3
import re
from mmap import ACCESS_READ, mmap
blocks = []
match_size = re.compile(br'(\d+):').match
with open('blocks.netstring', 'rb') as file, \
mmap(file.fileno(), 0, access=ACCESS_READ) as mm:
position = 0
for m in iter(lambda: match_size(mm, position), None):
i, size = m.end(), int(m.group(1))
blocks.append(mm[i:i + size])
position = i + size + 1 # shift to the next netstring
print(blocks)
作为替代方案,您可以consider BSON format for your data或ascii armor format。
答案 1 :(得分:0)
我认为您正在寻找的是byte_list=open('C:/Python34/testfile.txt','rb').read()
如果你知道每个项目有多少字节,你可以使用read(number_of_bytes)
一次处理一个项目。
read()
将读取整个文件,但是由您决定将整个字节列表解码为各自的项目。
答案 2 :(得分:0)
通常,由于您使用的是Python 3,因此您将使用bytes
个对象(这些对象是不可变的)和/或bytearray
个对象(这些对象是可变的)。
示例:
b1 = bytearray('hello', 'utf-8')
print b1
b1 += bytearray(' goodbye', 'utf-8')
print b1
open('temp.bin', 'wb').write(b1)
#------
b2 = open('temp.bin', 'rb').read()
print b2
输出:
bytearray(b'hello')
bytearray(b'hello goodbye')
b'hello goodbye'