从AS400/OS400提取ASCII文件转二进制遇TypeError错误求助
问题:从AS400/OS400提取ASCII文件时触发TypeError错误
尝试从AS400/OS400系统提取ASCII模式的文件并转换为可读的二进制格式,编写了如下代码:
def retrlines(self, cmd, callback = None): resp = self.sendcmd('TYPE A') with self.transfercmd(cmd) as connectioninfo, \ connectioninfo.makefile('rt', encoding="cp500") as fp: while 1: line = fp.readline(self.maxline + 1) callback(line) return self.voidresp()
运行时出现如下错误:
TypeError: a bytes-like object is required, not 'str'
对应的报错堆栈:
Task failed with exception Traceback (most recent call last): File "/home/sftp_file_hook.py", line 418, in retrieve_file conn.retrlines(f'RETR {remote_file_name}', callback) File "/opt/ftplib.py", line 472, in retrlines callback(line) TypeError: a bytes-like object is required, not 'str'
解决建议
报错核心原因是:你通过makefile('rt', encoding="cp500")读取的是字符串(str),但传入的callback函数期望接收字节流(bytes),类型不匹配导致错误。提供两种可行修复方案:
方案1:修改读取逻辑,返回bytes类型
将文件读取模式从文本模式('rt')改为二进制模式('rb'),去掉编码参数,让readline直接返回bytes,匹配callback的预期类型。同时补充循环终止条件,避免无限循环:
def retrlines(self, cmd, callback = None): resp = self.sendcmd('TYPE A') with self.transfercmd(cmd) as connectioninfo, \ connectioninfo.makefile('rb') as fp: while True: line = fp.readline(self.maxline + 1) if not line: # 读取到空字节时终止循环 break callback(line) return self.voidresp()
如果后续需要将bytes转换为cp500编码的字符串,可在callback内部执行line.decode('cp500')处理。
方案2:调整callback函数,适配str类型
如果业务允许修改callback逻辑,直接让它接收字符串类型即可。比如原本callback中处理bytes的代码(如line.decode('cp500')),可直接替换为使用传入的str参数。
内容的提问来源于stack exchange,提问作者Arya
相关产品推荐
相关产品推荐

