如何";“写入变量”;而不是",;提交;用Python

如何";“写入变量”;而不是",;提交;用Python,python,pdf,io,outputstream,pypdf,Python,Pdf,Io,Outputstream,Pypdf,我正在尝试编写一个函数,将pdf拆分为单独的页面。从…起我复制了一个简单的函数,可以将pdf拆分为单独的页面: def splitPdf(file_): pdf = PdfFileReader(file_) pages = [] for i in range(pdf.getNumPages()): output = PdfFileWriter() output.addPage(pdf.getPage(i)) with ope

我正在尝试编写一个函数,将pdf拆分为单独的页面。从…起我复制了一个简单的函数,可以将pdf拆分为单独的页面:

def splitPdf(file_):
    pdf = PdfFileReader(file_)
    pages = []
    for i in range(pdf.getNumPages()):
        output = PdfFileWriter()
        output.addPage(pdf.getPage(i))
        with open("document-page%s.pdf" % i, "wb") as outputStream:
            output.write(outputStream)
    return pages
但是,这会将新PDF写入文件,而不是将新PDF列表作为文件变量返回。因此,我将
output.write(outputStream)
的行更改为:

pages.append(outputStream)
但是,当尝试在页面列表中写入元素时,我得到了一个
ValueError:I/O操作,操作的是关闭的文件


有人知道我如何将新文件添加到列表并返回它们,而不是将它们写入文件吗?欢迎所有提示

您可以在模块中使用内存中的二进制流。这将在您的内存中存储pdf文件

import io

def splitPdf(file_):
    pdf = PdfFileReader(file_)
    pages = []
    for i in range(pdf.getNumPages()):
        outputStream = io.BytesIO()

        output = PdfFileWriter()
        output.addPage(pdf.getPage(i))
        output.write(outputStream)

        # Move the stream position to the beginning,
        # making it easier for other code to read
        outputStream.seek(0)

        pages.append(outputStream)
    return pages
要稍后将对象写入文件,请使用
shutil.copyfileobj

import shutil

with open('page0.pdf', 'wb') as out:
    shutil.copyfileobj(pages[0], out)

还没有使用PdfielWriter,但认为这应该有效

def splitPdf(file_):
    pdf = PdfFileReader(file_)
    pages = []
    for i in range(pdf.getNumPages()):
        output = PdfFileWriter()
        output.addPage(pdf.getPage(i))
        pages.append(output)
    return pages

def writePdf(pages):
    i = 1
    for p in pages:
        with open("document-page%s.pdf" % i, "wb") as outputStream:
            p.write(outputStream)
        i += 1

“PDF列表作为文件变量”的含义尚不完全清楚。如果要创建字符串而不是PDF内容的文件,并返回此类字符串的列表,请将
open()
替换为
StringIO
,然后调用
getvalue()
以获取内容:

import cStringIO

def splitPdf(file_):
    pdf = PdfFileReader(file_)
    pages = []
    for i in range(pdf.getNumPages()):
        output = PdfFileWriter()
        output.addPage(pdf.getPage(i))
        io = cStringIO.StringIO()
        output.write(io)
        pages.append(io.getvalue())
    return pages

您是否尝试过读取数据,而不是存储文件句柄-
pages.append(outputStream.read())
?您是否尝试过使用
cStringIO.StringIO
打开
outputStream
?上述用户所说的……您通常可以用
StringIO
对象替换文件,并将结果作为way@jonrsharpe-我刚试过,这给了我一个
IOError:文件未打开,无法读取ing
pages.append(outputStream.read())
。还有其他想法吗?@user4815162342-Ehm,没有,我还没有尝试过StringIO。关于如何实现这一点,有什么建议吗?非常欢迎使用代码示例……:(这个答案仅适用于Python 2)@Garrett不过,适应Python 3应该很简单。