首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyPDF2用Python加密PDF : AttributeError:'tuple‘对象没有属性’写‘

PyPDF2用Python加密PDF : AttributeError:'tuple‘对象没有属性’写‘
EN

Stack Overflow用户
提问于 2015-11-18 19:30:10
回答 1查看 827关注 0票数 0

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

使用Dictionary2在Dict1中查找密码,应用加密,最后在Dict1中使用电子邮件。在这一点上我被困在加密部分了。

我读过一些关于需要打开文件的问题和谷歌文章,但我不知道如何打开“输出”项.

错误:

代码语言:javascript
复制
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'

代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 19:47:56

代码语言:javascript
复制
outputStream = (file, "wb")

这只会创建一个包含文件和字符串的元组。PDF写入方法不知道如何处理任意的元组,它需要一个类似文件的对象。您可能希望打开该文件以便编写:

代码语言:javascript
复制
outputStream = open(file.name, "wb")

现在,从现有的文件对象中获取名称并重用它可能不是最好的方法。生成文件路径一次,然后重用该文件以打开原始文件,然后再次使用该路径写入您处理过的PDF文件。

此外,您的代码将通过使用文件上下文管理器进行改进。

代码语言:javascript
复制
with open(file, "wb") as outputStream:
    output.write(outputStream)

这样,您的文件将在语句末尾关闭,您的文件资源将被正确处理。它还降低了代码维护成本,因为您不需要对文件执行openclose语句,就像现在为您所做的那样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33788717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档