Python:将二进制数据块写入和读取到文件中

Python:将二进制数据块写入和读取到文件中,python,python-3.x,serialization,file-writing,Python,Python 3.x,Serialization,File Writing,我正在编写一个脚本,它将另一个python脚本分解成块,并使用pycrypto加密块(到目前为止,我已经成功地完成了所有这些),现在我将加密的块存储到一个文件中,以便解密程序可以读取并执行每个块。加密的最终结果是二进制输出列表(类似于块=[b'\xa1\r\xa594\x92z\xf8\x16\xaa',b'xffbi\xfdqx | \xcd\xdb\x1b\xb3'等]) 在将输出写入文件时,它们都会被放在一个大行中,因此在读取文件时,所有字节都会放在一个大行中,而不是原始列表中的每一项。我

我正在编写一个脚本,它将另一个python脚本分解成块,并使用pycrypto加密块(到目前为止,我已经成功地完成了所有这些),现在我将加密的块存储到一个文件中,以便解密程序可以读取并执行每个块。加密的最终结果是二进制输出列表(类似于
块=[b'\xa1\r\xa594\x92z\xf8\x16\xaa',b'xffbi\xfdqx | \xcd\xdb\x1b\xb3'等]

在将输出写入文件时,它们都会被放在一个大行中,因此在读取文件时,所有字节都会放在一个大行中,而不是原始列表中的每一项。我还尝试将字节转换为字符串,并在每个字节的末尾添加一个
'\n'
,但问题是我仍然需要这些字节,我不知道如何撤消字符串以获得原始字节

为了总结这一点,我希望:将每个二进制项写入文件中的单独一行,这样我可以轻松读取数据并在解密中使用它,或者我可以将数据转换为字符串,并在解密中撤消字符串以获取原始二进制数据

以下是写入文件的代码:

    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()
以及读取文件:

    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()

我想你要找的是
byte\u list=open('C:/Python34/testfile.txt','rb')。read()

如果知道每个项目有多少字节,可以使用
read(字节数)
一次处理一个项目


read()
将读取整个文件,但接下来由您将整个字节列表解码为各自的项。

一般来说,由于您使用的是Python 3,因此您将使用对象(不可变)和/或对象(可变)

例如:

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'

文件是没有任何隐含结构的字节流。如果要加载二进制blob列表,则应存储一些附加元数据以恢复结构,例如,您可以:

重读一遍:

#!/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)

或者,您可以将文本存储在文本文件中,也可以将任意字节存储在二进制文件中
readlines()
用于读取文本行。那么我的代码应该是什么样子呢?这到底是如何解决我的问题的?这只会给我一个巨大的字节,我正在寻找的是在接收端有一个字节的列表,进入(在你的情况下,当我读/读时,我可以很容易地衍生出
[b'hello',b'bye']
)“一个巨大的字节”-Lol“byte”现在几乎总是意味着“八位字节”,正好是8位。如果您实际处理的是二进制数据,那么在Python中使用单个字节值的
列表将是非常低效的,这就是为什么我建议使用
bytes
bytearray
对象的原因。您没有解释实际要存储和恢复的数据类型,因此很难给出更好的建议,特别是因为您同时引用了“字节”(意味着二进制数据)和文本字符串。我将编辑我的问题,希望这将有助于你理解我在寻找什么:我试图完成的是:我有一个python脚本,我将脚本分解为块,并使用pycrypto加密块(所有这些我都已成功完成),现在我将加密的块存储到一个文件中,以便解密程序可以读取并执行每个块。加密的最终结果是二进制输出列表