假设我有非常大的字节对象(加载二进制文件后),我想逐部分读取并推进起始位置直到它到达末尾。我使用切片来实现这一点。我担心每次我请求切片时 python 都会创建全新的副本,而不是简单地给我指向我想要的位置的内存地址。
简单的例子:
data = Path("binary-file.dat").read_bytes()
total_length = len(data)
start_pos = 0
while start_pos < total_length:
bytes_processed = decode_bytes(data[start_pos:]) # <---- ***
start_pos += bytes_processed
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,python 是否由于start_pos切片而从 开始创建全新的字节对象副本。如果是这样,避免数据复制并仅使用指针传递到字节数组的相关位置的最佳方法是什么。
音频文件通过API发送给我们,该API是Base64编码的PCM格式。我需要将其转换为PCM,然后转换为WAV进行处理。
我能够使用以下代码解码->保存到pcm->从pcm读取->另存为wav。
decoded_data = base64.b64decode(data, ' /')
with open(pcmfile, 'wb') as pcm:
pcm.write(decoded_data)
with open(pcmfile, 'rb') as pcm:
pcmdata = pcm.read()
with wave.open(wavfile, 'wb') as wav:
wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
wav.writeframes(pcmdata)
Run Code Online (Sandbox Code Playgroud)
如果我可以将输入字符串解码为二进制并将其另存为wav,会容易得多。所以我在python中将字符串转换为二进制中 做了类似的事情
decoded_data = base64.b64decode(data, ' /')
ba = ' '.join(format(x, 'b') for x in bytearray(decoded_data))
with wave.open(wavfile, 'wb') as wav:
wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
wav.writeframes(ba)
Run Code Online (Sandbox Code Playgroud)
但是我错a bytes-like object is required, not 'str'了wav.writeframes。
也尝试过base54.decodebytes()并得到相同的错误。
正确的方法是什么?
我有一个字节数组arr和一个十六进制数a:
arr = bytearray()
a = 'FE'
Run Code Online (Sandbox Code Playgroud)
如何将此数字附加到bytearray以具有相同的值,FE?我尝试过print(int(a, 16)),但似乎是一个坏主意(它打印254而不是FE).
我想实现一个从RawIOBase继承的类。我正在努力实现readinto方法。基本上,我不知道如何更改作为参数传递的bytearray对象的内容。
我已经尝试过以下(幼稚的)方法:
def readinto(self, b):
data = self.read(len(b))
b = data
return len(data)
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑这会将新bytearray对象分配给局部变量b,并且不会更改原始对象的内容bytearray。
我需要一个巨大的布尔数组。所有值都应初始化为“ True”:
arr = [True] * (10 ** 9)
Run Code Online (Sandbox Code Playgroud)
但是按上述方法创建会占用太多内存。所以我决定使用bytearray它:
arr = bytearray(10 ** 9) # initialized with zeroes
Run Code Online (Sandbox Code Playgroud)
是否有可能初始化bytearray与b'\x01'同样有效,因为它是由初始化b'\x00'?
我知道我可以bytearray用零初始化并反逻辑。但是如果可能的话,我宁愿不这样做。
timeit:
>>> from timeit import timeit
>>> def f1():
... return bytearray(10**9)
...
>>> def f2():
... return bytearray(b'\x01'*(10**9))
...
>>> timeit(f1, number=100)
14.117428014000325
>>> timeit(f2, number=100)
51.42543800899875
Run Code Online (Sandbox Code Playgroud) 我想通过 HTTP 发送音频数据,但我不明白为什么会出现此异常:
Run Code Online (Sandbox Code Playgroud)Exception happened during processing of request from ('127.0.0.1', 59976) Traceback (most recent call last): File "/usr/lib/python3.6/socketserver.py", line 654, in process_request_thread self.finish_request(request, client_address) File "/usr/lib/python3.6/socketserver.py", line 364, in finish_request self.RequestHandlerClass(request, client_address, self) File "/usr/lib/python3.6/socketserver.py", line 724, in __init__ self.handle() File "/usr/lib/python3.6/http/server.py", line 418, in handle self.handle_one_request() File "/usr/lib/python3.6/http/server.py", line 406, in handle_one_request method() File "/home/vivanov/temp.py", line 113, in do_GET data.append(bytearray(stream.read(CHUNK))) TypeError: 'bytearray' object cannot be interpreted as an integer
问题似乎与将值传递给wfile.write.
我该如何解决这个问题?
这是我的代码:
Exception happened during processing …Run Code Online (Sandbox Code Playgroud)