【问题标题】:Python 3.6 looking in wrong module/library ( _io.TextIOWrapper ) for function that should be called from pathlibPython 3.6 在错误的模块/库( _io.TextIOWrapper )中查找应该从 pathlib 调用的函数
【发布时间】:2020-04-28 22:08:31
【问题描述】:

我从下面的代码中收到以下错误:

AttributeError: '_io.TextIOWrapper' 对象没有属性 'write_text'

代码:

import pathlib
output_filepath = pathlib.Path(r'/home/john/somedir/data/somefilename.csv')
with output_filepath.open(mode='w') as output_file:
    for line in result_list:
        # Write records to the file
        output_file.write_text('%s\n' % line[1])

"result_list" 来自一个 result_list = cursor.fetchall()

奇怪的是这段代码是从一个不会产生这个错误的程序中剪切和粘贴的。在对象“output_filepath”被实例化和在“with”块中使用之间,没有任何东西会触及它。

我在 Google 上搜索了错误并获得零点击(这让我非常惊讶)。我还查看了当您为新问题输入“主题”时出现的各种点击(stackoverflow)。

我最初将“from pathlib import Path”作为我的导入行,但为了找到问题,将其(连同“output_filepath = ...”行)更改为您在此处看到的内容。

我确定我在某处做错了什么,但我看不出它是什么,而且我不明白为什么代码可以在另一个程序中运行,但在这个程序中却不行。

【问题讨论】:

    标签: python pathlib


    【解决方案1】:

    您的代码中的两个对象output_filepathoutput_file 具有不同的类/类型,因此您可以使用不同的方法。

    您尝试使用write_text,它是pathlib.Path 对象的方法。但是,当您调用output_filepath.open(mode='w') 时,您将得到一个打开的文件对象 作为回报。你可以看到它——Python 在错误消息中说它的类型是_io.TextIOWrapper。因此output_file.write_text 不起作用。

    这个打开的文件对象没有write_text 方法,但有write 方法,Python 中大多数文件或类似文件的对象都有。

    所以这行得通:

    import pathlib
    output_filepath = pathlib.Path(r'/home/john/somedir/data/somefilename.csv')
    with output_filepath.open(mode='w') as output_file:
        for line in result_list:
            # Write records to the file
            output_file.write('%s\n' % line[1])
    

    【讨论】:

    • 你说得对,output_file.write() 有效,但我不清楚在什么情况下我可以/应该使用 .write_text()。我想这确实是一个有争议的问题,因为我现在有了可以工作的代码,但我绝对希望更好地理解 .write() 与 .write_text() 的用法。我已经阅读了我能找到的关于 .write_text() 的所有内容(我上周才开始使用 pathlib),但我认为我还不太了解它。
    • 抱歉没有解释清楚!我已经更新了答案。现在有意义吗?
    • 谢谢!这对问题的 _io.TextIOWrapper 方面非常有帮助,这就是我所假设的。我不明白的部分是为什么它不调用 pathlib.Path 中的 .open() 方法。对象 output_filepath 被实例化为 pathlib.Path 对象。似乎该对象会像实例化一样表现并相应地响应 .open() 调用。再说一次,我无法告诉你我多么感激你花时间帮助我了解发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多