标签: bytesio

为什么 TextIOWrapper 关闭给定的 BytesIO 流?

如果我在 python 3 中运行以下代码

from io import BytesIO
import csv
from io import TextIOWrapper


def fill_into_stringio(input_io):
    writer = csv.DictWriter(TextIOWrapper(input_io, encoding='utf-8'),fieldnames=['ids'])
    for i in range(100):
        writer.writerow({'ids': str(i)})

with BytesIO() as input_i:
    fill_into_stringio(input_i)
    input_i.seek(0)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

ValueError: I/O operation on closed file.
Run Code Online (Sandbox Code Playgroud)

如果我不使用 TextIOWrapper,io 流将保持打开状态。例如,如果我将函数修改为

def fill_into_stringio(input_io):
    for i in range(100):
        input_io.write(b'erwfewfwef')
Run Code Online (Sandbox Code Playgroud)

我不再收到任何错误,因此出于某种原因,TestIOWrapper 正在关闭我想稍后阅读的流。这是打算像这样吗,是否有一种方法可以在不自己编写 csv 编写器的情况下实现我的尝试?

python csv bytesio python-3.x

4
推荐指数
1
解决办法
2449
查看次数

图像下载 mime 类型验证 python 请求

我使用python中的requests库通过http下载大量图像文件。我使用 python 中的 BytesIO 将接收到的内容转换为原始字节,然后使用 Pillow() 将此原始内容保存为 jpeg 文件。

from PIL import Image
from io import BytesIO

rsp = requests.get(imageurl)
content_type_received = rsp.headers['Content-Type'] # mime type
binarycontent = BytesIO(rsp.content)
if content_type_received.startswith('image'): # image/jpeg, image/png etc
    i = Image.open(binarycontent)
    outfilename = os.path.join(outfolder,'myimg'+'.jpg')
    with open(outfilename, 'wb') as f:
        f.write(rsp.content)
    rsp.close()
Run Code Online (Sandbox Code Playgroud)

这段代码有什么潜在的安全风险?(我不确定我们可以在多大程度上相信服务器说响应头中的 mime 类型确实是服务器所说的?)是否有更好的方法来编写安全下载例程?

python bytesio python-imaging-library python-3.x python-requests

3
推荐指数
1
解决办法
2907
查看次数

在 FastAPI 中渲染 NumPy 数组

我发现如何使用 FastAPI 将 numpy 数组作为图像返回?然而,我仍然在努力展示图像,它看起来只是一个白色的方块。

io.BytesIO我像这样读入一个数组:

def iterarray(array):
    output = io.BytesIO()
    np.savez(output, array)
    yield output.get_value()
Run Code Online (Sandbox Code Playgroud)

在我的端点中,我的回报是StreamingResponse(iterarray(), media_type='application/octet-stream')

当我留空media_type以推断时,会下载一个 zip 文件。

如何将数组显示为图像?

python numpy bytesio fastapi

3
推荐指数
1
解决办法
7176
查看次数

为什么截断 BytesIO 会搞砸?

在 OSX 上的 Python 3.5.1 上运行:

import io

b = io.BytesIO()

b.write(b'222')
print(b.getvalue())

b.truncate(0)
b.write(b'222')
print(b.getvalue())
Run Code Online (Sandbox Code Playgroud)

产生:

b'222'
b'\x00\x00\x00222'
Run Code Online (Sandbox Code Playgroud)

所以截断以BytesIO某种方式导致它开始在开头插入额外的零字节?为什么?

python bytesio python-3.x

2
推荐指数
1
解决办法
1420
查看次数

在 HTML 表格中,如何使用 python 在 jupyter 笔记本中的绘图旁边添加文本?

关于如何创建 1 X 2 HTML 表,其中单元格 {0} 是 matplotlib 图,单元格 {1} 是 Python 3.X 的文本描述,有什么想法吗?

import matplotlib.pyplot as plt
from io import BytesIO
%matplotlib inline

def add_split_screen(fig, text, iwidth=None):

    figdata = BytesIO()
    fig.savefig(figdata, format='png') 
    figdata.seek(0)
    figdata
    figdata.close()
    iwidth = ' width={0} '.format(iwidth) if iwidth is not None else ''
    datatable = '<table><tr><td>{0}</td><td>{1}</td></tr></table>'.format(figdata, text)
    display(HTML(datatable)) 
Run Code Online (Sandbox Code Playgroud)

设置测试用例:

fig, ax = plt.subplots(1,1, figsize=(6,4))
ax.plot([1,2,3])
text = '<h4>Special Chart:</h4><BR>Description of chart will go here.'
Run Code Online (Sandbox Code Playgroud)

然后在 Jupyter 笔记本中运行该函数:

add_split_screen(fig, text, iwidth='500px')
Run Code Online (Sandbox Code Playgroud)

我的输出如下: 在此输入图像描述

然而,我有兴趣在 Jupyter 笔记本中实际看到该情节。

html matplotlib bytesio python-3.x jupyter-notebook

2
推荐指数
1
解决办法
2193
查看次数

“需要一个类似字节的对象”但我使用的是字节

使用 Python3,我以二进制模式重新打开了标准输出。之后,当我print("Hello")告诉我需要使用类似字节的对象时。很公平,它现在处于二进制模式。

但是,当我这样做时:

print(b"Some bytes")
Run Code Online (Sandbox Code Playgroud)

仍然收到此错误:

TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)

那是怎么回事?

python printing bytesio python-3.x

2
推荐指数
1
解决办法
248
查看次数

pandas pd.read_table 是否支持 io.BytesIO 和 StringIO?

我有一个io.BytesIO对象,iostream它是一个从磁盘读取的 be2 文件,我要将列标题附加到 table/ iostream

f = io.BytesIO()
f.write(b'A,B,C,D\n')
f.write(iostream.getvalue())

pd.read_table(f, sep=',', index_col=False, error_bad_lines=False, encoding='utf-8', dtype=type_map)
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误,

pandas.errors.EmptyDataError: No columns to parse from file
Run Code Online (Sandbox Code Playgroud)

我想知道如何解决这个问题。

也试过

f = io.StringIO()
f.write('A,B,C,D\n')    
f.write(iostream.getvalue().decode())

pd.read_table(f, sep=',', index_col=False, error_bad_lines=False, encoding='utf-8', dtype=type_map)
Run Code Online (Sandbox Code Playgroud)

出错

pandas.errors.ParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.
Run Code Online (Sandbox Code Playgroud)

bytesio python-3.x pandas

2
推荐指数
1
解决办法
4665
查看次数

来自 BytesIO 的熊猫 read_csv

我有一个类似 BytesIO 文件的对象,其中包含一个 CSV。我想将它读入 Pandas 数据帧,而不是在两者之间写入磁盘。

移动电源

在我的用例中,我将文件直接下载到 BytesIO。对于这个 MWE,我将在磁盘上有一个文件,将其读入 BytesIO,然后将其读入 Pandas。磁盘步骤只是为了制作 MWE。

file.csv

a,b
1,2
3,4
Run Code Online (Sandbox Code Playgroud)

脚本:

import pandas as pd
from io import BytesIO
bio = BytesIO()
with open('file.csv', 'rb') as f:
   bio.write(f.read())

# now we have a BytesIO with a CSV
df = pd.read_csv(bio)
Run Code Online (Sandbox Code Playgroud)

结果:

Traceback (most recent call last):
  File "pandas-io.py", line 8, in <module>
    df = pd.read_csv(bio)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 685, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 457, in _read
    parser = TextFileReader(fp_or_buf, …
Run Code Online (Sandbox Code Playgroud)

python csv file bytesio pandas

2
推荐指数
1
解决办法
4305
查看次数

谷歌云存储从字节上传失败

我正在尝试在 python 中动态创建一个文件,然后将其上传到谷歌云存储,但我无法从字符串或字节对象上传。

脚本的基本设置是

from google.cloud import storage

storage_client = storage.Client()

storage_client = storage.Client()
bucket = storage_client.bucket("bucket_name")
blob = bucket.blob("destination_blob_name")
Run Code Online (Sandbox Code Playgroud)

如果我然后获取一个文件并运行upload_from_filename它上传就可以了

blob.upload_from_filename("source_file_name.pdf")
Run Code Online (Sandbox Code Playgroud)

如果我获取相同的文件但尝试使用上传upload_from_string

with open('source_file_name.pdf', 'rb') as f:
    file_string = f.read()
    blob.upload_from_string(file_string, content_type='application/pdf')
Run Code Online (Sandbox Code Playgroud)

我收到错误:

TypeError: None could not be converted to bytes
Run Code Online (Sandbox Code Playgroud)

我已经检查过并且file_string是一个有效的字节对象

同样,如果我尝试upload_from_file

with open('source_file_name.pdf', 'rb') as f:
    file_string = f.read()
    blob.upload_from_file(file_string, content_type='application/pdf')
Run Code Online (Sandbox Code Playgroud)

我收到错误:

AttributeError: 'bytes' object has no attribute 'tell'
Run Code Online (Sandbox Code Playgroud)

在我的实际用例中,我使用 BytesIO 创建一个字节对象,它看起来像

pdf = BytesIO()
pisa.CreatePDF(html, pdf)
resp = pdf.getvalue()
pdf.close() …
Run Code Online (Sandbox Code Playgroud)

python bytesio google-cloud-storage

2
推荐指数
1
解决办法
3476
查看次数

使用 io.BytesIO 从 azure 存储读取图像?

我有一个包含一些图像的 azure blob 存储帐户。我想将它们作为字节读取以进行图像处理,因此我可以将它们与 Microsoft 的 Face API 一起使用。我收到一条错误消息,告诉我我需要一个“字节”对象,但我以为我已经将图像从 blob 转换为字节格式。我已经提供了我使用的整个代码,但问题来自最后一段代码

%matplotlib inline
import matplotlib.pyplot as plt
import io
from io import StringIO
import numpy as np
import cv2
from PIL import Image
#from StringIO import StringIO
from PIL import Image
import os
from array import array
Run Code Online (Sandbox Code Playgroud)

我的凭据:

azure_storage_account_name = 'musicsurveyphotostorage'
azure_storage_account_key = None  # dont need key... we will access public 
blob... 

if azure_storage_account_name is None:
raise Exception("You must provide a name for an Azure Storage account")   
from azure.storage.blob …
Run Code Online (Sandbox Code Playgroud)

python azure bytesio azure-storage-blobs python-3.x

1
推荐指数
1
解决办法
2133
查看次数

将模型读取为字节而不保存在 python 中的位置?

Python,我已将模型保存为 joblib 文件在某个位置,我在“rb”读取字节中打开文件,是否可以直接转换为字节而不是保存在文件中,

\n\n
import joblib\njoblib.dump(model, 'model.joblib')\n#Read as bytes\nmodel_bytes = open('C:/Models/model.joblib','rb').read()\nmodel_bytes\n#This outputs like \nb'\\x80\\x03csklearn.ensemble.forest\\nRandomForestClassifier\\nq\\x00)\\x81q\\x01}q\\x...\xe2\x80\xa6..\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里我不想保存在某个位置,所以我尝试使用临时文件,但这不起作用我知道,还有其他选择吗

\n\n
import tempfile\nbytes_model = tempfile.TemporaryFile()\nbytes_model.read(model)\n\n#Also bytes function doesn't work\nbytes_model = bytes(model)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不需要创建文件,因此我不必访问它,\n是否可以将模型变量读取为字节?

\n

python io pickle bytesio joblib

0
推荐指数
1
解决办法
4220
查看次数

discord.py 发送 BytesIO

我正在使用 Pillow 处理图像,然后想将其发送到 Discord。我的代码: https: //paste.pythondiscord.com/comebefupo.py

当使用 image.show() 时,操作的图像显示良好。

但是,当我想将图像上传到 Discord 时,机器人会卡住并且不会抛出错误:

got bytes from direct image string
got bytes from member/user pfp or str
opened image
opened draw
drew top text
drew bottom text
prepared buffer
prepared file
# Bot just gets stuck here, no errors
Run Code Online (Sandbox Code Playgroud)

根据多个来源(1、2 我通过将图像保存到 BytesIO 流中,然后使用.seek(0)

根据discord.File的文档io.BufferedIOBase,它需要一个(我相信)我放入的。

编辑:先保存图像,然后发送即可。

# Return whole image object
return image

self.convert_bytes(image_bytes, top_text, bottom_text).save('image.png')
await ctx.send(file=discord.File('image.png'))
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这个有效,而另一件事却不起作用......

bytesio python-3.x discord.py

0
推荐指数
1
解决办法
3465
查看次数