从文件读取字节时,像列表一样读取

时间:2019-01-27 20:16:27

标签: python-3.x

当我使用以下命令从文件读取字节时 open("file.txt", "rb"") python在字节的开头和结尾添加[],例如list。

我尝试使用re.sub手动删除方括号,但是由于它是列表,因此我得到一个错误代码,提示TypeError: expected string or bytes-like object,因为它是列表。 (我之所以在下面使用f.readlines(0)而不是仅读取普通文件是因为我在此文件上存储了其他变量)

>>> arsBenZ = os.urandom("128")
>>> print(arsBenZ) 
b'\xb9\xfe\xeb\x03e\xe8\x8e\x0c\xc1\x05\xb1\xe8\xadB\x9d\xdf_-\xd2\x8c\x18\xe2\xb2\xc7\xf9I\x18\xa7(\xefe\xc9\xc4:\xb3\x93\n+\x7f\x8e\xd2\x82\xf0!\x9668\x01\xcdf\x0f\x15\xe6r\xec\x01\xb8\x7f\x8d\xa25\xd6yq\x1e#\xfb\x0eY\x0fE\x1a)V\xb2\xcb_\x89yH\xd9\xf9\xc7.\x12\x98\x16\xe4!k\xdfU>\xa2\xf0H\xcbT3.\xbd\xbdn\x8aU<\xeb\xf7\xca\xd6~\xf2R\xca\x0f\x8f\x9d\xce\xd8D\xa6f,H\xf8\xcc\xca\x1f' 
>>> f = open("t.text", "wb") 
>>> f.write(arsBenZ)
>>> f.close() 
>>> f = open("t.text", "rb") 
>>> arsBenKelev = f.readlines(0)
>>> print(arsBenKelev)
[b'\xb9\xfe\xeb\x03e\xe8\x8e\x0c\xc1\x05\xb1\xe8\xadB\x9d\xdf_-\xd2\x8c\x18\xe2\xb2\xc7\xf9I\x18\xa7(\xefe\xc9\xc4:\xb3\x93\n', b'+\x7f\x8e\xd2\x82\xf0!\x9668\x01\xcdf\x0f\x15\xe6r\xec\x01\xb8\x7f\x8d\xa25\xd6yq\x1e#\xfb\x0eY\x0fE\x1a)V\xb2\xcb_\x89yH\xd9\xf9\xc7.\x12\x98\x16\xe4!k\xdfU>\xa2\xf0H\xcbT3.\xbd\xbdn\x8aU<\xeb\xf7\xca\xd6~\xf2R\xca\x0f\x8f\x9d\xce\xd8D\xa6f,H\xf8\xcc\xca\x1f\xcc\x96\xaa\x9d\xc5\xebE\xc8\x0b\xe6G"\xb9\xf1T\x80']

如何将其读取为字节而不是列表? (我将其他字节存储在不同的行上,该行存储在第1行,另一个存储在行2。不能将它们存储在不同的文件中。)

编辑:解决方案是这样的:f.read(data_size)。

1 个答案:

答案 0 :(得分:1)

arsBenKelev = f.readlines(0)

这只是将所有文件行作为列表读取,大小提示为零(不是很有用)

您只想阅读第一行:

arsBenKelev = next(f)

请注意,如果您的数据是二进制数据,那么“行”的概念将无济于事,因为如果您的数据中有换行符,它将被视为行的结尾。

在这里将会发生,因为您正在写入的数据是随机的。因此,请考虑将数据存储为json或base64编码,以确保换行符不会受到干扰(并且确实如此,请查看您已读取的完整数据,它有2行)

或者记下数据大小,然后使用f.read(data_size)。知道大小是二进制流的唯一方法。