2015-11-21 3 views
0

Goal = Открыть файл, зашифровать файл, зашифровать файл.
Пытается использовать модуль PyPDF2 для достижения этого. Я подтвердил, что «input» является объектом типа файла. Я исследовал эту ошибку, и она переводится как «файл не найден». Я считаю, что он каким-то образом связан с файлом/файлом, но я не уверен, как отлаживать или устранять неполадки. и получение следующей ошибки:PyPDF2 IOError: [Errno 22] Недопустимый аргумент в PyPdfFileReader Python 2.7

Traceback (most recent call last): 
    File "CommissionSecurity.py", line 52, in <module> 
    inputStream = PyPDF2.PdfFileReader(input) 
    File "build\bdist.win-amd64\egg\PyPDF2\pdf.py", line 1065, in __init__ 
    File "build\bdist.win-amd64\egg\PyPDF2\pdf.py", line 1660, in read 
IOError: [Errno 22] Invalid argument 

Ниже приведен соответствующий код. Я не уверен, как исправить эту проблему, потому что я не совсем уверен, в чем проблема. Любые рекомендации приветствуются.

for ID in FileDict: 
     if ID in EmailDict : 
      path = "C:\\Apps\\CorVu\\DATA\\Reports\\AlliD\\Monthly Commission Reports\\Output\\pdcom1\\" 
      #print os.listdir(path) 
      file = os.path.join(path + FileDict[ID]) 

      with open(file, 'rb') as input: 
       print type(input) 
       inputStream = PyPDF2.PdfFileReader(input) 
       output = PyPDF2.PdfFileWriter() 
       output = inputStream.encrypt(EmailDict[ID][1]) 
      with open(file, 'wb') as outputStream: 
       output.write(outputStream) 
     else : continue 
+0

@Evert I изменен на основе вашего предложения, подтвердил правильность использования PdfFileWriter и исправил проблему вводаStream. Я также подтвердил, что «файл» - это объект типа файла. Я продолжаю получать ту же ошибку. – AlliDeacon

ответ

0

Используя открытый (файл 'радиоканал') был причиной проблемы becuase PdfFileReader() делает это автоматически.Я просто удалил оператор with и исправил проблему.

with open(file, 'rb') as input: 
    inputStream = PyPDF2.PdfFileReader(input) 
1

Я думаю, ваша проблема может быть вызвана тем, что вы используете один и тот же имя файла, как открытых, так и запись в файл, открыв его дважды:

with open(file, 'rb') as input : 
    with open(file, 'wb') as outputStream : 

Режим w будет усечь файл , таким образом, вторая линия усекает вход.
Я не уверен, что вы намереваетесь, потому что вы не можете попробовать прочитать (начало) файла и в то же время перезаписать его. Даже если вы попытаетесь записать в конец файла, вам придется поместить указатель файла где-нибудь. Итак, создайте дополнительный выходной файл с другим именем; вы всегда можете переименовать этот выходной файл в свой входной файл после закрытия обоих файлов, тем самым перезапирая ваш входной файл.

Или вы могли бы сначала прочитать весь файл в память, а затем писать:

with open(file, 'rb') as input: 
    inputStream = PyPDF2.PdfFileReader(input) 
    output = PyPDF2.PdfFileWriter() 
    output = input.encrypt(EmailDict[ID][1]) 
with open(file, 'wb') as outputStream: 
    output.write(outputStream) 

Примечания:

  • назначать inputStream, но никогда не использовать его
  • назначать PdfFileWriter() в output, а затем присвойте что-то еще output в следующей строке. Следовательно, вы никогда не использовали результат с первой строки output =.

Пожалуйста, внимательно ознакомьтесь с тем, что вы делаете, потому что, по его мнению, в вашем коде есть множество других проблем.


В качестве альтернативы, вот несколько советов, которые могут помочь:

documentation предполагает, что вы также можете использовать имя файла в качестве первого аргумента в PdfFileReader:

stream – A File object or an object that supports the standard read and seek methods similar to a File object. Could also be a string representing a path to a PDF file.

Так попробуйте:

inputStream = PyPDF2.PdfFileReader(file) 

Вы также можете попробовать установить strict аргумент False:

strict (bool) – Determines whether user should be warned of all problems and also causes some correctable problems to be fatal. Defaults to True.

Например:

inputStream = PyPDF2.PdfFileReader(file, strict=False) 
+0

Это имеет смысл. Я переконфигурирую ваши советы и пометьте свой ответ, если он решит мою проблему. Спасибо! – AlliDeacon

+0

@AlliDeacon Но см. Мои последние данные с пунктами «Примечания». – Evert

+0

Мое понимание заключается в том, что output = PyPDF2.PdfFileWriter() инициализированный вывод для записи в. Я определенно проясню это. Я попробовал множество решений, InputStream должен быть отстраненным. Утром я снова увижу свежие глаза. Спасибо за ваш вклад и помощь. – AlliDeacon

Смежные вопросы