2015-11-21 54 views
0

目标=打开文件,加密文件,写入加密文件。
尝试使用PyPDF2模块来完成此操作。我已经验证过“输入”是一个文件类型的对象。我研究了这个错误,它转化为“找不到文件”。我相信它以某种方式与文件/文件路径链接,但我不确定如何调试或排除故障。并得到以下错误: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我根据您的建议重构,证实PdfFileWriter正确使用,并纠正了inputStream问题。我还验证了“文件”是一个文件类型对象。我继续得到相同的错误。 – AlliDeacon

回答

0

使用open(文件, 'RB')是导致监守PdfFileReader问题()这是否自动的。我刚刚删除了与声明,并纠正了这个问题。

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

我的理解是输出= PyPDF2.PdfFileWriter()初始化输出能够被写入。我肯定会澄清这一点。我尝试了很多解决方案,InputStream必须是一个失败者。我会在早上用新鲜的眼睛重新审视。感谢您的意见和协助。 – AlliDeacon

相关问题