Как перезаписать файл, который в данный момент читает Python - PullRequest
3 голосов
/ 30 апреля 2010

Я не слишком уверен, что лучший способ выразить это, но я хочу прочитать PDF-файл, внести различные изменения и сохранить измененный PDF-файл поверх исходного файла. На данный момент я могу сохранить измененный файл PDF в отдельный файл, но я хочу заменить оригинальный, а не создавать новый файл.

Вот мой текущий код:

from pyPdf import PdfFileWriter, PdfFileReader

output = PdfFileWriter()
input = PdfFileReader(file('input.pdf', 'rb'))
blank = PdfFileReader(file('C:\\BLANK.pdf', 'rb'))

# Copy the input pdf to the output.
for page in range(int(input.getNumPages())):
    output.addPage(input.getPage(page))

# Add a blank page if needed.
if (input.getNumPages() % 2 != 0):
    output.addPage(blank.getPage(0))

# Write the output to pdf.
outputStream = file('input.pdf', 'wb')
output.write(outputStream)
outputStream.close()

Если я изменю outputStream на другое имя файла, оно будет работать нормально, я просто не смогу сохранить поверх входного файла, потому что он все еще используется. Я пытался .close() стримировать, но это также давало мне ошибки.

У меня такое ощущение, что у этого есть довольно простое решение, просто мне не повезло найти его.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 30 апреля 2010

Вы всегда можете переименовать временный выходной файл в старый файл:

import os
f = open('input.pdf', 'rb')
# do stuff to temp.pdf
f.close()
os.rename('temp.pdf', 'input.pdf')
3 голосов
/ 30 апреля 2010

Вы сказали, что пытались закрыть () поток, но получили ошибки? Вы можете удалить объекты PdfFileReader, чтобы никто не имел доступа к потоку. А затем закройте поток.

from pyPdf import PdfFileWriter, PdfFileReader

inputStream = file('input.pdf', 'rb')
blankStream = file('C:\\BLANK.pdf', 'rb')
output = PdfFileWriter()
input = PdfFileReader(inputStream)
blank = PdfFileReader(blankStream)

...

del input # PdfFileReader won't mess with the stream anymore
inputStream.close()
del blank
blankStream.close()

# Write the output to pdf.
outputStream = file('input.pdf', 'wb')
output.write(outputStream)
outputStream.close()
1 голос
/ 30 апреля 2010

Если PDF-файлы достаточно малы (это зависит от вашей платформы), вы можете просто прочитать все, закрыть файл, изменить данные, а затем записать все обратно в тот же файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...