繁体   English   中英

PyPDF2在Windows上使用Python加密PDF:AttributeError:'tuple'对象没有属性'write'

[英]PyPDF2 Encrypting PDF with Python on Windows: AttributeError: 'tuple' object has no attribute 'write'

编辑以包含完整的代码:程序基础知识-提取ID / EMAIL / PASSWORD的CSV文件,并创建dictionary1。 在路径中创建ID /文件的dictionary2。

使用Dictionary2在Dict1中查找密码,应用加密,最后使用Dict1中的电子邮件发送电子邮件。 我现在停留在加密部分。

我已经阅读了一些有关需要打开文件的问题和有关Google的文章,但不确定如何打开“输出”项...

错误:

Traceback (most recent call last):
  File "CommissionSecurity.py", line 54, in <module>
    output.write(outputStream)
  File "build\bdist.win-amd64\egg\PyPDF2\pdf.py", line 472, in write
AttributeError: 'tuple' object has no attribute 'write'

码:

import os 
import re
import csv
import PyPDF2


# Create a dictionary with the csv values
EmailDict = dict()
with open('commissionrepemaillist.csv', 'r') as infile:
    reader = csv.reader(infile)
    for row in reader :
        REP = row[0]
        EMAIL = row[1]
        PASSWORD = row[2]
        EmailDict[REP] = EMAIL, PASSWORD

# create dictionary of IDs and Pdf Files
FileDict = dict()
path = "C:\\Apps\\CorVu\\DATA\\Reports\\AlliD\\Monthly Commission  Reports\\Output\\pdcom1"  
for FILE in os.listdir(path):
    split = re.split("[_.]", FILE)
    ID = split[1]
    FileDict[ID] = FILE

for ID in FileDict:
    # print REP
    # print ID # debug: REP always coming over 764 
    if ID in EmailDict : 
        #print FileDict[ID]
        path = "C:\\Apps\\CorVu\\DATA\\Reports\\AlliD\\Monthly Commission Reports\\Output\\pdcom1\\"
        file = open(os.path.join(path + FileDict[ID]), 'rb')
        output = PyPDF2.PdfFileWriter()
        input = PyPDF2.PdfFileReader(file)

        print ID, EmailDict[ID][1]  # returning the correct value for encryption
        output.encrypt(EmailDict[ID][1])
        outputStream = (file, "wb")
        output.write(outputStream)

        output.close()
        input.close()

    else : continue
outputStream = (file, "wb")

这只会创建一个带有文件和字符串的元组。 PDF writer编写方法不知道如何处理任意元组,它需要一个类似文件的对象。 您可能想改为打开该文件以进行写入:

outputStream = open(file.name, "wb")

现在,从现有文件对象中获取名称并重用它可能不是执行此操作的最佳方法。 生成一次文件路径,然后重新使用该路径来打开原始文件,然后再次用于写出已处理的PDF文件。

此外,通过使用文件上下文管理器可以改善您的代码。

with open(file, "wb") as outputStream:
    output.write(outputStream)

这样,您的文件将在语句末尾关闭,并且文件资源将得到正确处理。 这也减少了代码维护成本,因为您不需要像现在那样为文件配对openclose语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM