如果我在 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中的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
我发现如何使用 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 文件。
如何将数组显示为图像?
在 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某种方式导致它开始在开头插入额外的零字节?为什么?
关于如何创建 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 笔记本中实际看到该情节。
使用 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)
那是怎么回事?
我有一个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 文件的对象,其中包含一个 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 中动态创建一个文件,然后将其上传到谷歌云存储,但我无法从字符串或字节对象上传。
脚本的基本设置是
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) 我有一个包含一些图像的 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,我已将模型保存为 joblib 文件在某个位置,我在“rb”读取字节中打开文件,是否可以直接转换为字节而不是保存在文件中,
\n\nimport 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..\nRun Code Online (Sandbox Code Playgroud)\n\n在这里我不想保存在某个位置,所以我尝试使用临时文件,但这不起作用我知道,还有其他选择吗
\n\nimport tempfile\nbytes_model = tempfile.TemporaryFile()\nbytes_model.read(model)\n\n#Also bytes function doesn't work\nbytes_model = bytes(model)\nRun Code Online (Sandbox Code Playgroud)\n\n我不需要创建文件,因此我不必访问它,\n是否可以将模型变量读取为字节?
\n我正在使用 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)
我不知道为什么这个有效,而另一件事却不起作用......