You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:31:16