我避免在磁盘上创建文件,这是我到目前为止所得到的:
def get_zip(request):
import zipfile, StringIO
i = open('picture.jpg', 'rb').read()
o = StringIO.StringIO()
zf = zipfile.ZipFile(o, mode='w')
zf.writestr('picture.jpg', i)
zf.close()
o.seek(0)
response = HttpResponse(o.read())
o.close()
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = "attachment; filename=\"picture.zip\""
return response
Run Code Online (Sandbox Code Playgroud)
你认为是正确的 - 优雅 - pythonic足够吗?有更好的方法吗?
谢谢!
我似乎无法找到io.StringIOPython3中的默认编码.这是区域设置stdio吗?
我该怎么改变它?
有了stdio,似乎只是重新打开正确的编码工作,但没有重新打开的事情StringIO.
我正在查看StringIO它所说的内容的来源:
cStringIO,但它不是可子类化的.StringIO 就像一个内存文件对象,为什么它比真正的文件对象慢?
python版本是3.6.6,而pandas_datareader版本是0.7.0
当我导入pandas_datareader时,发生如下错误。
C:\PycharmProjects\Demo\venv\Scripts\python.exe C:/PycharmProjects/Demo/stock.py
Traceback (most recent call last):
File "C:/PycharmProjects/Demo/stock.py", line 3, in <module>
import pandas_datareader as wb
File "C:\PycharmProjects\Demo\venv\lib\site-packages\pandas_datareader\__init__.py", line 2, in <module>
from .data import (DataReader, Options, get_components_yahoo,
File "C:\PycharmProjects\Demo\venv\lib\site-packages\pandas_datareader\data.py", line 7, in <module>
from pandas_datareader.av.forex import AVForexReader
File "C:\PycharmProjects\Demo\venv\lib\site-packages\pandas_datareader\av\__init__.py", line 3, in <module>
from pandas_datareader.base import _BaseReader
File "C:\PycharmProjects\Demo\venv\lib\site-packages\pandas_datareader\base.py", line 11, in <module>
from pandas.compat import StringIO, bytes_to_str
ImportError: cannot import name 'StringIO'
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
首先,我了解如何在 Python3 中从字符串编写 UTF-8,并且StringIO推荐用于此类字符串构建。但是,我特别需要一个类似二进制文件的对象,为此我需要BytesIO. 如果我执行以下操作,那么数据最终会崩溃,因为它被读取为Latin1,我的计算机的默认区域设置/字符集。
with io.StringIO() as sb:
csv.writer(sb).writerows(rows)
sb.flush()
sb.seek(0)
# blows up with Latin1 encoding error
job = bq.load_table_from_file(sb, table_ref, job_config=job_config)
Run Code Online (Sandbox Code Playgroud)
所以我的解决方法是这个怪物,使内存使用量加倍:
with io.StringIO() as sb:
csv.writer(sb).writerows(rows)
sb.flush()
sb.seek(0)
with io.BytesIO(sb.getvalue().encode('utf-8')) as buffer:
job = bq.load_table_from_file(buffer, table_ref, job_config=job_config)
Run Code Online (Sandbox Code Playgroud)
在此链中的某个位置必须有一种方法来指定字节编码,以便类似文件的读者sb将看到 UTF-8 格式的数据。或者有没有办法使用csv.writer()字节流?
我在 StackOverflow 上寻找了这两个答案,但我发现的通常是写入文件和内存中所有内容都指向的内容StringIO。
我正在尝试解码 base64 编码的图像并将其放入我使用 ReportLab 生成的 PDF 中。我目前是这样做的(image_data是 base64 编码的图像,story已经是 ReportLab 的故事):
# There is some "story" I append every element
img_height = 1.5 * inch # max image height
img_file = tempfile.NamedTemporaryFile(mode='wb', suffix='.png')
img_file.seek(0)
img_file.write(image_data.decode('base64'))
img_file.seek(0)
img_size = ImageReader(img_file.name).getSize()
img_ratio = img_size[0] / float(img_size[1])
img = Image(img_file.name,
width=img_ratio * img_height,
height=img_height,
)
story.append(img)
Run Code Online (Sandbox Code Playgroud)
它有效(尽管对我来说仍然很难看)。我想摆脱临时文件(文件类对象不应该起作用吗?)。
为了摆脱临时文件,我尝试使用StringIO模块,创建类文件对象并传递它而不是文件名:
# There is some "story" I append every element
img_height = 1.5 * inch # max image height
img_file …Run Code Online (Sandbox Code Playgroud) import StringIO
output = StringIO.StringIO()
output.write('this is the first line\n the new line should come here')
a = output.getvalue()
output.close()
print a
Run Code Online (Sandbox Code Playgroud)
但是新行字符\n不会被打印为新行。
我如何获得换行符?
我正在使用'pdf-reader'gem来阅读pdf文档的原始内容,以便我可以将它们发布(http-post)到API.要确认API实现可以从原始内容创建有效的pdf文档,我写了一个小小的要点来验证我的代码以阅读pdf内容.
出于某种原因,我总是得到'PDF不包含EOF标记(PDF :: Reader :: MalformedPDFError)'.
谁能指出我哪里出错了?
ZipFile我正在尝试从 URL读取数据并通过使用解析 as csvStringIO内的数据ZipFilepandas.read_csv
r = req.get("http://seanlahman.com/files/database/lahman-csv_2014-02-14.zip").content
file = ZipFile(StringIO(r))
salaries_csv = file.open("Salaries.csv")
salaries = pd.read_csv(salaries_csv)
Run Code Online (Sandbox Code Playgroud)
最后一行给了我一个错误:
CParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试使用
salaries = pd.read_csv(file.open("Salaries.csv"))
Run Code Online (Sandbox Code Playgroud)
有用。
所以我想知道我在这里错过了什么。
file.open应该返回一个ZipExtFile对象,并且由于 read_csv 仅接受字符串或文件句柄/StringIO输入,为什么最后一行可以工作?
io.BytesIO()我发现这两个模块在使用or创建临时文件方面有很多相似之处,io.StringIo()每个tempfile.TemporaryFile()
模块的用途是什么?