文件流 - ValueError:嵌入空字节

Luc*_*asi 3 python python-3.x

我正在尝试通过 HTTP 请求下载 .png 图像,并通过 HTTP 将其上传到另一个位置。我的目标是避免将文件保存在磁盘上,以便在内存中处理。

我有下面的代码:

  1. 下载文件并将其转换为字节数组:
resp = requests.get(
    'http://www.personal.psu.edu/crd5112/photos/PNG%20Example.png',
    stream=True)

img = BytesIO(resp.content)
Run Code Online (Sandbox Code Playgroud)
  1. 将文件上传到远程 HTTP 存储库
data=open(img.getvalue()).read()

r = requests.post(url=url, data=data, headers=headers, auth=HTTPBasicAuth('user', 'user'))
Run Code Online (Sandbox Code Playgroud)

读取字节数组时,我收到 ValueError 异常“嵌入空字节”。

如果我将文件保存到磁盘上并按如下方式加载,则不会出现错误:

data=open(img.getvalue()).read()

r = requests.post(url=url, data=data, headers=headers, auth=HTTPBasicAuth('user', 'user'))
Run Code Online (Sandbox Code Playgroud)

关于如何在不将文件保存在磁盘上的情况下实现它的任何建议?

Shr*_*ut1 6

我相信嵌入的空字节错误是由支持代码中执行的任何操作的库的文件名输入要求引起的。通过使用一个BytesIO对象,它会将自己呈现给该库,“就像”它被包装在一个文件中一样。

以下是我在尝试使用 tar 文件解决相同问题时使用的示例代码。该代码应该能够满足其他各种库的大多数文件输入要求。

我在这里发现的关键是使用作为文件对象传递到的BytesIO周围的对象。我尝试的其他技术没有效果。remote_file.contenttarfile.open

from io import BytesIO
import requests
import tarfile

remote_file=requests.get ('https://download.site.com/files/file.tar.gz')

#Extract tarball contents to memory
tar=tarfile.open(fileobj=BytesIO(remote_file.content))
#Optionally print all folders / files within the tarball
print(tar.getnames())
tar.extractall('/home/users/Documents/target_directory/')
Run Code Online (Sandbox Code Playgroud)

这消除了我在其他方法中遇到的错误ValueError: embedded null byteexpected str, bytes or os.PathLike object, not _io.BytesIO