我最近收到了一个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')
。这将以文本模式打开和读取文件,这意味着您可以直接以字符串形式读取内容
此外,考虑到以上内容,请小心如何将内容写入输出文件(以字节或字符串形式(。