标签: bytesio

奇怪的"BadZipfile:错误的CRC-32"问题

此代码简化了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)

zipfile bytesio stringio

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

如何在python 3中通过FTP发送StringIO?

我想通过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)

python ftp bytesio stringio python-3.x

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

将 io.BytesIO 对象传递给 gzip.GzipFile 并写入 GzipFile

我基本上想做的正是文档中的内容gzip.GzipFile

\n\n
\n

调用 GzipFile 对象\xe2\x80\x99s close() 方法不会关闭 fileobj,因为您可能希望在压缩数据后附加更多材料。这还允许您传递一个为写入而打开的 io.BytesIO 对象作为 fileobj,并使用 io.BytesIO object\xe2\x80\x99s getvalue() 方法检索结果内存缓冲区。

\n
\n\n

对于普通文件对象,它可以按预期工作。

\n\n
>>> import gzip\n>>> fileobj = open("test", "wb")\n>>> fileobj.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=fileobj)\n>>> gzipfile.writable()\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n\n

gzip.GzipFile但在传递对象时我无法设法获取可写对象io.BytesIO

\n\n
>>> import io\n>>> bytesbuffer = io.BytesIO()\n>>> bytesbuffer.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=bytesbuffer)\n>>> gzipfile.writable()\nFalse\n
Run Code Online (Sandbox Code Playgroud)\n\n

我是否必须打开io.BytesIO显式内容才能进行写入?我该怎么做?或者返回的文件对象和 我没有想到的open(filename, "wb")返回的对象之间是否有区别?io.BytesIO()

\n

gzip bytesio python-3.x

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

使用 PyPDF2 和 BytesIO 将 PDF 页面转换为图像

我有一个函数可以从 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)添加了。 …

python pdf pypdf bytesio

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

tempfile模块和IO文件类对象有什么区别

io.BytesIO()我发现这两个模块在使用or创建临时文件方面有很多相似之处,io.StringIo()每个tempfile.TemporaryFile() 模块的用途是什么?

temporary-files bytesio stringio python-3.x

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

从 FTP 服务器上的 ZIP 存档读取文件,无需下载到本地系统

我在 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 文件?这还有必要吗?

python ftp ftplib bytesio pandas

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

相当于 Python 2 中 BytesIO 的 getbuffer

object.getbuffer().nbytes在 Python 3 中,我可以通过(where )获取 ByteIO 对象的大小,但在 Python 2 中object = ByteIO()最好的等效项是什么?getbuffer()经过一些探索,我发现我可以使用len(object.getvalue())or sys.getsizeof(object),但我不知道 Python 2 是否会接受它们。

python bytesio python-2.7

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

如何对多个 zip 文件进行上下文管理 BytesIO?

我正在尝试在创建多个 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)

python zip bytesio python-3.x

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

在 python 中将 BytesIO 添加到 BytesIO tar.gz

我在从 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 …

python tar bytesio

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

通过 Flask 和 BytesIO 显示来自 S3 的文件(图像)

我正在尝试使用 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 对象 …

python bytesio flask boto3

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

标签 统计

bytesio ×10

python ×7

python-3.x ×4

stringio ×3

ftp ×2

boto3 ×1

flask ×1

ftplib ×1

gzip ×1

pandas ×1

pdf ×1

pypdf ×1

python-2.7 ×1

tar ×1

temporary-files ×1

zip ×1

zipfile ×1