Python解密文件类型错误的问题



我最近收到了一个Python脚本,可以用它解密Excel文件。我之前没有任何使用Python的经验,所以我一直在试图找出如何通过谷歌搜索正确运行脚本,但我遇到了困难。据我所知,这个脚本已经有几年的历史了,可能不是Python 3的最新版本。

from StringIO import StringIO
import os
import tkFileDialog
def crypt(t, k):
old = StringIO(t)
new = StringIO(t)

for position in xrange(len(t)):
bias = ord(k[position % len(k)])

old_char = ord(old.read(1))
new_char = chr(old_char ^ bias)

new.seek(position)
new.write(new_char)

new.seek(0)
return new.read()

dirname = tkFileDialog.askdirectory(initialdir="/",  title='Please select a directory')
files = [f for f in os.listdir(dirname) if os.path.join(dirname, f)]
for f in files:
t = os.path.join(dirname, f)
tout = os.path.join(dirname, 'decr_%s' % f)

f_in = open(t, 'rb')
f_out = open(tout, 'wb')
key = "b8,xaA3rvXb-d&w8P6!9k7dQs.dbkLEw?t!3!`sM(,f!2^6h"
f_out.write(crypt(f_in.read(), key))
f_in.close()
f_out.close()

这是我第一次收到的剧本。在出现一些ModuleNotFoundErrors和AttributeErrors之后,我尝试进行更改。现在,出现的错误是:

Traceback (most recent call last):
File "/Users/xxx/Desktop/App/Decrypt.py", line 34, in <module>
f_out.write(crypt(f_in.read(), key))
File "/Users/xxx/Desktop/App/Decrypt.py", line 9, in crypt
old = StringIO(t)
TypeError: initial_value must be str or None, not bytes

不知道如何处理此错误–如果有任何帮助或建议,我们将不胜感激!

f_in.read((从文件中读取字节,StringIO无法将字节值作为初始值处理。您可以将字节变量转换为str变量,并在StringIO构造函数中使用该变量。

另请参阅:将字节转换为字符串

file.open()函数有'rb'参数,该参数指定它将以字节形式读取文件的内容。

为了将字节转换为字符串,以便可以使用其他函数,您有两个选项:

  • 使用decode("utf-8")函数。请注意,您正在使用的数据的编码确实是utf-8,否则请指定您的数据正在使用的编码
    您的线路应该是:f_out.write(crypt(f_in.read().decode("utf-8"), key))
  • 如果确定文件仅包含文本,则可以省略'b'参数,而仅使用f_in = open(t, 'r')。这将以文本模式打开和读取文件,这意味着您可以直接以字符串形式读取内容

此外,考虑到以上内容,请小心如何将内容写入输出文件(以字节或字符串形式(。

最新更新