首页 > 解决方案 > TypeError:“用户名”对象在 python3 中不可迭代

问题描述

虽然令人兴奋,但代码出现错误尝试迭代对象但没有运气


import os
import sys

class usernames(object):
    def __init__(self, filename: str):
        self.filename = filename
        self.words = self.file_to_text

    def file_to_text(self):
        with open(self.filename, "r") as f:
            name_list = [line.rstrip() for line in f]

        return name_list


def main():
    user_files = []

    if os.path.isfile(sys.argv[1]):
        filename = os.path.splitext(sys.argv[1])[-1].lower()
        if filename.endswith('.txt'):
            user_files.append(sys.argv[1])

    for files in user_files:
        test_name = usernames(files)
        print(test_name)
    for test in test_name:
        print(test)


if __name__ == '__main__':
    main()

python3 main.py test.txt

猫测试.txt

亚历克斯·
鲍勃
·约翰

但是出现这样的错误

TypeError: "username' object is not iterable

预期输出:

亚历克斯·
鲍勃
·约翰

标签: python-3.xoop

解决方案


您需要提供一种__iter__方法来使您的对象可迭代:

import os
import sys

class usernames(object):
    def __init__(self, filename: str):
        self.filename = filename
        self.words = self.file_to_text()    # <<== needs parens to call method

    def file_to_text(self):
        with open(self.filename, "r") as f:
            name_list = [line.rstrip() for line in f]

        return name_list

    def __iter__(self):
        for word in self.words:
            yield word


def main():
    user_files = ['_test_data.txt']

#     if os.path.isfile(sys.argv[1]):
#         filename = os.path.splitext(sys.argv[1])[-1].lower()
#         if filename.endswith('.txt'):
#             user_files.append(sys.argv[1])

    for files in user_files:
        test_name = usernames(files)
    for test in test_name:
        print(test)


if __name__ == '__main__':
    main()

输出:

Alex
bob
John

推荐阅读