我试图对一个文件进行编码,并将编码输出到一个新文件中,但我遇到了以下错误:
TypeError: ord() expected string of length 1, but int found
我的代码:
from sys import argv, exit
def encode(data):
encoded = ''
while data:
current = data[0]
count = 1
for i in data[1:]:
if i == current:
count += 1
else:
break
if count == 255:
break
encoded += '{}{}'.format(chr(ord(current) & 255), chr(count & 255)) #error occurs here.
data = data[count:]
return encoded
if __name__ == '__main__':
if len(argv) < 2:
print('Please specify input file!')
exit(0)
with open(argv[1], 'rb') as (f):
data = f.read()
with open(argv[1] + '.out', 'wb') as (f):
f.write(encode(data))
附加问题:如何解码编码文件?
您正在读取字节(open(..., 'rb')
(,因此当您获取字节字符串的一个元素时,您将获得一个字节,即一个数字。这个数字已经是字符代码了,所以去掉ord
。或者,您可以在不使用b
修饰符(open(..., 'r')
(的情况下打开文件,该修饰符将返回一个字符串;不过,我建议将其保留为字节字符串(或者,如果解析非ascii内容,可能会遇到编码问题(。
保存文件时会遇到类似的问题:无法将字符串写入用b
修饰符打开的文件中。由于您的字符超出了ascii范围(>128(,所以作为字符串编写不是一个好主意,因为python会尝试对您的字符进行编码(例如,UTF-8(,最终会得到完全不同的字节。因此,最好的解决方案可能不是将数据连接到循环中的字符串(执行'{}{}'.format(...)
的部分(,而是有一个列表(encoded = []
,与encoded.append(current)
连接(,并在循环后使用bytes(encoded)
将其转换为字节字符串。然后,您可以毫无问题地将其传递给write
。
至于如何解码文件,您可以像编码一样打开文件,读取两个字节b1
和b2
,并将[b1]*b2
附加到输出中(再次作为列表(,然后使用bytes()
将其转换为字节字符串。