【问题标题】:When reading bytes from a file, reads it like a list从文件中读取字节时,像列表一样读取它
【发布时间】:2020-06-30 13:36:07
【问题描述】:

当我从文件中读取字节时,使用 open("file.txt", "rb"")python 在字节的开头和结尾添加括号,如列表。

我尝试使用 re.sub 手动剪切括号,但因为它是一个列表,所以我收到一个错误代码 TypeError: expected string or bytes-like object,因为它是一个列表。 (我在下面使用f.readlines(0) 而不是普通的文件读取的原因是因为我在这个文件中存储了其他变量)

>>> foo = os.urandom("128")
>>> print(foo) 
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(foo)
>>> f.close() 
>>> f = open("t.text", "rb") 
>>> bar = f.readlines(0)
>>> print(bar)
[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)。

【问题讨论】:

  • 阅读全文只需f.read(),只需一行next(f)
  • @Jean-FrançoisFabre 正如我所说,每一行都是不同的变量,因此我不能只做 f.read()。
  • f.readlines 返回一个列表。你不能让它返回一个列表以外的任何东西。但是,您可以检索此列表的元素。 (你确实知道括号表示一个列表,对吧?)
  • 想要逐行读取二进制文件有点奇怪。如果它有线条,那不是文字吗?

标签: python python-3.x


【解决方案1】:
foo = f.readlines(0)

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

你想读第一行就行了:

foo = next(f)

请注意,如果您的数据是二进制的,“行”的概念不会有太大帮助,因为如果您的数据中有换行符,它将被视为一行的结尾。

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

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

【讨论】:

  • 现在我只是得到它的一部分。 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' 而不是完整的字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多