当前位置: 首页 > 知识库问答 >
问题:

Python 3中的日志记录错误。x:TypeError:需要类似字节的对象,而不是“str”

马庆
2023-03-14

我在Python 3.6.5。

当使用日志记录我得到以下错误-

TypeError:需要一个类似字节的对象,而不是'str'

它在Python2中运行良好。我还尝试将字符串转换为Byte对象,但无法解决问题

if __name__ == '__main__':
    config_file = '/source/account_content_recommendation/config/sales_central_config.json'
    try:
        ### Read all the parameters -
        params = json.loads(hdfs.read_file(config_file))

        ### Create the logging csv file -
        hdfs_log_path = params["hdfs_log_path"]
        hdfs.create_file(hdfs_log_path, "starting ... ", overwrite = True)
        log_name = 'Account_Content_Matching'


        global stream
        log = logging.getLogger('Acct_Cont_Log')
        stream = BytesIO()
        handler = logging.StreamHandler(stream)
        log.setLevel(logging.DEBUG)

        for handle in log.handlers:
            log.removeHandler(handle)

        log.addHandler(handler)

        #env = sys.argv[1]
        env = 'dev'
        formatter = logging.Formatter('{0}| %(asctime)s| {1}| %(module)s| %(funcName)s| %(lineno)d| %(levelname)s| %(message)r'.format(log_name, env))
        handler.setFormatter(formatter)

        log.info("starting execution of Account_Content_Matching load")
        #log.info("sys args %s"%(str(sys.argv)))

        def flush_log():
            global stream
            msg = stream.getvalue()
            hdfs.append_file(hdfs_log_path, msg)
            stream.seek(0)
            stream.truncate(0)
            print(msg)
            sys.stdout.flush

    except Exception as error:
        raise error

我得到以下错误-

Traceback(最近一次调用): File"/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/log/init.py",第994行,在emitstream.write(msg)TypeError:一个字节样的对象是必需的,而不是'str'

还...

消息:“正在开始执行帐户内容匹配加载”参数:()I1001 06:29:35.870266 140241833649984:29]正在开始执行帐户内容匹配加载

共有1个答案

靳茂
2023-03-14

在记录器设置中,您:

  • 使用BytesIO作为流
  • 传递字符串给它

>

stream = StringIO()

将所有字符串转换为字节,然后将其传递给记录器方法(比前者更复杂,意义也更小):

log.info("starting execution of Account_Content_Matching load".encode())  # log.info(b"starting execution of Account_Content_Matching load")  # For literals
log.debug(some_string_var.encode())
 类似资料:
  • 以下是尝试使用套接字修改用户提供的输入的代码: 当我执行它并提供输入时,会发生以下错误: 我能做些什么来解决这个问题?

  • 我正在运行一个代码,但这一行出现错误: TypeError:需要一个类似字节的对象,而不是str 这里显示的是类型列表的各个部分,是 TypeError:需要一个类似字节的对象,而不是str

  • 我正在尝试遵循这个OpenCV练习http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html 但是在运行mergevec.py的步骤中遇到了困难(我使用Python版本而不是.cpp版本)。我使用的是Python3,而不是本文中提到的Python2.x。 此文件的源是https://github.com/

  • 我得到一个“TypeError:需要一个类似字节的对象,而不是'str'”。我在使用StringIO时遇到了一个错误“TypeError:initial_值必须是str或None,而不是bytes”,我在使用Python 3.7。 我也得到这个函数同样的错误。"返回pickle.load(打开(DATA_FILE))"

  • 问题内容: 我最近已经迁移到Py 3.5。这段代码在Python 2.7中正常工作: 升级到3.5后,我得到了: 最后一行错误(模式搜索代码)。 我试过使用语句两侧的函数,也尝试过: -无济于事。 我能够很快解决几乎所有的问题,但是这个小小的声明困扰着我。 问题答案: 你以二进制模式打开文件: 这意味着从文件读取的所有数据都作为bytes对象而不是作为对象返回。然后,你不能在容纳测试中使用字符串:

  • 我最近迁移到了Py3.5。这段代码在Python2.7中正常工作: 升级到3.5后,我得到了: 最后一行(模式搜索代码)出错。 我尝试在语句的两侧使用函数,也尝试了: -无济于事。 我能够很快解决几乎所有的2:3问题,但这个小小的声明困扰着我。