«ValueError: операция ввода-вывода для закрытого файла» после повторного открытия файла и проверки, если файл закрыт - PullRequest
0 голосов
/ 08 октября 2018

Этот сводит меня с ума.Я пишу программу на Python 2.7, которая работает с PDF-файлами, используя PyPDF2.Он просматривает основной PDF-файл постранично, извлекает их текст, чтобы определить, какому другому PDF-файлу соответствует эта страница, и заменяет первую страницу указанного PDF-файла (вторую) текущей выбранной страницей.

Хотяпервые шаги программы не вызывают проблем, проблема возникает, когда я пытаюсь записать файл после его прочтения.

Хотя полная программа намного длиннее, это минимальное требование для воспроизведения ошибки:

#! python2
from pyPdf import PdfFileWriter, PdfFileReader

dir = [path to target directory]
inp = PdfFileReader(open([path to main PDF], "rb"))
temp = dir+"/"+[other target PDF filename]
outp = PdfFileWriter()
outp.addPage(inp.getPage(0))   #in the full version, this appends page "i"-- the iterator for the loop-- instead of zero
f = open(temp,"rb")
inp2 = PdfFileReader(f)
for i in range(1,inp2.numPages): outp.addPage(inp2.getPage(i))
f.close()
g = open(temp,"wb")
print g.closed    #prints "False"
g.seek(0)         #I added this on a hunch, but it makes no difference.
outp.write(g)     #It crashes here.  It doesn't crash on any "g.seek" or even "g.truncate()"

Я знаю, что это немного странно с точки зрения стиля, но я первоначально попробовал это с более стандартными блоками with в различных конфигурациях (да, я знаю, что с блоками закрывают свои файлы, когдаВы оставляете их и внимательно следите за моими отступами).

После этого я попробовал один оператор open в режиме r+b (единственная причина, по которой они были отделены для начала, заключалась в том, чтобы учесть редкие ситуации, когда пользователь предпочел бы, чтобы выходные файлы сохранялись где-то еще).Вместо этого это будет последовательно выдавать IOError: [Errno 0] Error s.

Я переключился на прямое присвоение отдельного FileObjects, потому что это казалось более простым в управлении.

Ошибка, которую он в настоящее время производит, следующая:

Traceback (most recent call last):
  File "errorversion.py", line 16, in <module>
outp.write(g)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 264, in write
self._sweepIndirectReferences(externalReferenceMap, self._root)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 339, in _sweepIndirectReferences
self._sweepIndirectReferences(externMap, realdata)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 315, in _sweepIndirectReferences
value = self._sweepIndirectReferences(externMap, value)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 339, in _sweepIndirectReferences
self._sweepIndirectReferences(externMap, realdata)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 315, in _sweepIndirectReferences
value = self._sweepIndirectReferences(externMap, value)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 324, in _sweepIndirectReferences
value = self._sweepIndirectReferences(externMap, data[i])
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 339, in _sweepIndirectReferences
self._sweepIndirectReferences(externMap, realdata)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 315, in _sweepIndirectReferences
value = self._sweepIndirectReferences(externMap, value)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 345, in _sweepIndirectReferences
newobj = data.pdf.getObject(data)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 645, in getObject
self.stream.seek(start, 0)
ValueError: I/O operation on closed file

Более ранняя ошибка, возникшая с одним открытием чтения / записи, была следующей:

Traceback (most recent call last):
  File "RemoveAndAdd.py", line 45, in <module>
main()
  File "RemoveAndAdd.py", line 40, in main
output.write(f)
  File "C:\Python27\lib\site-packages\pyPdf\pdf.py", line 283, in write
obj.writeToStream(stream, key)
  File "C:\Python27\lib\site-packages\pyPdf\generic.py", line 513, in writeToStream
value.writeToStream(stream, encryption_key)
  File "C:\Python27\lib\site-packages\pyPdf\generic.py", line 133, in writeToStream
data.writeToStream(stream, encryption_key)
  File "C:\Python27\lib\site-packages\pyPdf\generic.py", line 215, in writeToStream
    stream.write(repr(self))
IOError: [Errno 0] Error
...