此代码简化了Django应用程序中的代码,该应用程序通过HTTP多部分POST接收上传的zip文件,并对内部数据进行只读处理:
#!/usr/bin/env python
import csv, sys, StringIO, traceback, zipfile
try:
import io
except ImportError:
sys.stderr.write('Could not import the `io` module.\n')
def get_zip_file(filename, method):
if method == 'direct':
return zipfile.ZipFile(filename)
elif method == 'StringIO':
data = file(filename).read()
return zipfile.ZipFile(StringIO.StringIO(data))
elif method == 'BytesIO':
data = file(filename).read()
return zipfile.ZipFile(io.BytesIO(data))
def process_zip_file(filename, method, open_defaults_file):
zip_file = get_zip_file(filename, method)
items_file = zip_file.open('items.csv')
csv_file = csv.DictReader(items_file)
try:
for idx, row in enumerate(csv_file):
image_filename = row['image1']
if open_defaults_file:
z = zip_file.open('defaults.csv')
z.close()
sys.stdout.write('Processed %d items.\n' % …Run Code Online (Sandbox Code Playgroud) 我想通过FTP上传文本字符串作为文件。
import ftplib
from io import StringIO
file = StringIO()
file.write("aaa")
file.seek(0)
with ftplib.FTP() as ftp:
ftp.connect("192.168.1.104", 2121)
ftp.login("ftp", "ftp123")
ftp.storbinary("STOR 123.txt", file)
Run Code Online (Sandbox Code Playgroud)
此代码返回错误:
TypeError: 'str' does not support the buffer interface
Run Code Online (Sandbox Code Playgroud) 我基本上想做的正是文档中的内容gzip.GzipFile:
\n\n\n调用 GzipFile 对象\xe2\x80\x99s close() 方法不会关闭 fileobj,因为您可能希望在压缩数据后附加更多材料。这还允许您传递一个为写入而打开的 io.BytesIO 对象作为 fileobj,并使用 io.BytesIO object\xe2\x80\x99s getvalue() 方法检索结果内存缓冲区。
\n
对于普通文件对象,它可以按预期工作。
\n\n>>> import gzip\n>>> fileobj = open("test", "wb")\n>>> fileobj.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=fileobj)\n>>> gzipfile.writable()\nTrue\nRun Code Online (Sandbox Code Playgroud)\n\ngzip.GzipFile但在传递对象时我无法设法获取可写对象io.BytesIO。
>>> import io\n>>> bytesbuffer = io.BytesIO()\n>>> bytesbuffer.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=bytesbuffer)\n>>> gzipfile.writable()\nFalse\nRun Code Online (Sandbox Code Playgroud)\n\n我是否必须打开io.BytesIO显式内容才能进行写入?我该怎么做?或者返回的文件对象和 我没有想到的open(filename, "wb")返回的对象之间是否有区别?io.BytesIO()
我有一个函数可以从 PDF 文件中获取页面,并使用(PIL Fork)PyPDF2将第一页转换为 png(或 jpg)Pillow
from PyPDF2 import PdfFileWriter, PdfFileReader
import os
from PIL import Image
import io
# Open PDF Source #
app_path = os.path.dirname(__file__)
src_pdf= PdfFileReader(open(os.path.join(app_path, "../../../uploads/%s" % filename), "rb"))
# Get the first page of the PDF #
dst_pdf = PdfFileWriter()
dst_pdf.addPage(src_pdf.getPage(0))
# Create BytesIO #
pdf_bytes = io.BytesIO()
dst_pdf.write(pdf_bytes)
pdf_bytes.seek(0)
file_name = "../../../uploads/%s_p%s.png" % (name, pagenum)
img = Image.open(pdf_bytes)
img.save(file_name, 'PNG')
pdf_bytes.flush()
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
OSError:无法识别图像文件<_io.BytesIO对象位于0x0000023440F3A8E0>
我发现一些线程有类似的问题(PIL open() 方法不适用于 BytesIO),但我看不出我在这里错在哪里,因为我已经pdf_bytes.seek(0)添加了。 …
io.BytesIO()我发现这两个模块在使用or创建临时文件方面有很多相似之处,io.StringIo()每个tempfile.TemporaryFile()
模块的用途是什么?
我在 FTP 服务器上的目标文件是 ZIP 文件,.CSV 位于更远的两个文件夹中。
我如何才能使用 BytesIO 让 pandas 读取 csv 而无需下载它?
这是我到目前为止所拥有的:
ftp = FTP('FTP_SERVER')
ftp.login('USERNAME', 'PASSWORD')
flo = BytesIO()
ftp.retrbinary('RETR /ParentZipFolder.zip', flo.write)
flo.seek(0)
Run Code Online (Sandbox Code Playgroud)
作为flo我感兴趣的 BytesIO 对象,我如何能够在对象内向下导航几个文件夹,以允许 pandas 读取我的 .csv 文件?这还有必要吗?
object.getbuffer().nbytes在 Python 3 中,我可以通过(where )获取 ByteIO 对象的大小,但在 Python 2 中object = ByteIO()最好的等效项是什么?getbuffer()经过一些探索,我发现我可以使用len(object.getvalue())or sys.getsizeof(object),但我不知道 Python 2 是否会接受它们。
我正在尝试在创建多个 zip 文件时对 BytesIO 流使用上下文管理器。在写入第一个 zip 文件后,我找不到“重置”BytesIO 对象的方法,因此我可以使用相同的 BytesIO 对象创建下一个 zip 文件。在将第二个 zip 文件写入磁盘后尝试打开该文件时,我总是收到“无法打开文件...作为存档”错误。第一个 zip 文件打开得很好。我已经搜索过,但找不到解决方案。将模式从写入更改为追加也没有帮助。当然,我可以重新初始化一个新的 BytesIO 对象,但这会破坏上下文管理器。下面是我认为应该有效的代码。我在 Windows 10 上使用 Anaconda Python 3.6.6。
import io
import os
import zipfile
with io.BytesIO() as bytes_io:
with zipfile.ZipFile(bytes_io, mode='w') as zf:
filecount = 0
for item in os.scandir(r'C:\Users\stephen\Documents'):
if not item.is_dir():
zf.write(item.path, item.name)
filecount += 1
if filecount % 3 == 0:
with open(r'C:\Users\stephen\Documents\\' + str(filecount // 3) + '.zip', 'wb') as f:
f.write(bytes_io.getvalue())
bytes_io.seek(0)
bytes_io.truncate()
Run Code Online (Sandbox Code Playgroud) 我在从 BytesIO 对象用 Python 编写 .tar.gz 文件时遇到问题。只编写普通的 tar 文件效果很好,但如果我将写入模式更改为 .tar.gz (或 bz 或 xz),它不会生成有效的 tar 文件。
我做了一个精简版本如下:
def string_to_tarfile(name, string):
encoded = string.encode('utf-8')
s = BytesIO(encoded)
tar_info = tarfile.TarInfo(name=name)
tar_info.mtime=time.time()
tar_info.size=len(encoded)
return s, tar_info
file1='hello'
file2='world'
f=BytesIO()
tar = tarfile.open(fileobj=f, mode='w:gz')
string, tar_info = string_to_tarfile("file1.txt", file1)
tar.addfile(tarinfo=tar_info, fileobj=string)
string, tar_info = string_to_tarfile("file2.txt", file2)
tar.addfile(tarinfo=tar_info, fileobj=string)
f.seek(0)
with open('whatevs.tar.gz', 'wb') as out:
out.write(f.read())
Run Code Online (Sandbox Code Playgroud)
这应该做的是创建一个包含“file1.txt”和“file2.txt”的whatevs.tar.gz 文件。
如果我将 'w:gz' 替换为 'w'(并删除 .gz 结尾),我会得到一个包含正确内容的 tarfile,但将其添加回来会导致 10 字节损坏的 tar.gz 文件
我想将其写入 bytesio,因为我实际上正在将其上传到 S3。
我不确定我是否严重误读了这里的文档,我已经浏览了一百万篇文章,他们要么制作 tar …
我正在尝试使用 Boto3 从 AWS S3 中将文件直接提取到 BytesIO 对象中。这最终将用于操作下载的数据,但现在我只是想通过 Flask 将该文件直接提供给用户。据我了解,以下内容应该有效,但无效。浏览器只是不显示任何内容(并且只显示下载的几个字节的数据)。
(在这个例子中,我的示例文件是一个 png)
from flask import Flask, send_from_directory, abort, Response, send_file, make_response
import boto3, botocore
import os
import io
AWS_ACCESS_KEY = os.environ['AWS_ACCESS_KEY'].rstrip()
AWS_SECRET_KEY = os.environ['AWS_SECRET_KEY'].rstrip()
S3_BUCKET = "static1"
app = Flask(__name__, static_url_path='/tmp')
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
s3 = boto3.client('s3', aws_access_key_id=AWS_ACCESS_KEY, aws_secret_access_key=AWS_SECRET_KEY,)
file = io.BytesIO()
metadata = s3.head_object(Bucket=S3_BUCKET, Key=path)
conf = boto3.s3.transfer.TransferConfig(use_threads=False)
s3.download_fileobj(S3_BUCKET, path, file)
return send_file(file, mimetype=metadata['ContentType'])
if __name__ == '__main__':
app.run(debug=True,port=3000,host='0.0.0.0')
Run Code Online (Sandbox Code Playgroud)
如果我修改该核心例程以将 BytesIO 对象写入磁盘,然后将其读回新的 BytesIO 对象 …