通过 OOP 获取目录中的文件不起作用

我仍在为 OOP 的想法而苦苦挣扎,但这是我的尝试。我已经搜索过 StackOverflow 或 OOP 阅读资料,但没有一个能给我答案,所以我向你寻求帮助!


背景


我试图将目录中所有 .csv 文件的名称放入列表中,并最终通过 pandas 操作它们。问题是在进行 for 循环glob.iglob(os.path.join(dir, ".csv")并获取特定于这些文件的名称并将其附加到 class 中声明的列表中时Initial(),我希望在打印时出现文件名称以及 .csvinit.lst但相反,它给了我一个空列表。


我的代码


class Initial():

    def __init__(self):

        self.lst = []

        self.params = []

        self.bad_temp = []

        self.bad_offsetn = []

        self.bad_offsetp = []

        self.bad_IT = []

        self.choicefile = []

        self.finalfile = []



    def get_path(self):

        while True:

            dir = input("Paste full path to directory here: ")

            #print(dir)

            print(os.path.isdir(dir))

            if os.path.isdir(dir) == True:

                for files in glob.iglob(os.path.join(dir, ".csv")):

                    print(files)

                    longname = os.path.basename(files)

                    self.lst.append(longname)

                return self.lst

                break

            else:

                print('\n')

                print('Sorry that is not a valid path/directory. Please try again.')

                continue


我试过的

  1. 我已经尝试打印我可以打印的代码的每个部分。一切正常直到打印dir,但它以某种方式没有注册 for 循环。

  2. 我尝试使用此代码,这是获取目录中文件列表的另一种方法。onlyfiles = [f for f in os.listdir(dir) if os.path.isfile(os.path.join(dir,f))]. 这行得通,它打印了我需要的东西,我可能可以调整它以仅获取 .csv 文件,但我不认为我可以休息,直到我明白我最初尝试做错了什么。

  3. 我也尝试过将函数移出类或完全删除函数以仅使用init.lst但它仍然返回空。(是的,我导入了 os 和 glob)

我对此的看法

我认为我的问题是是否.lst申报__init__。但是根据我的理解,这并不重要,因为它变成了需要self.调用 a 的实例化变量。正如函数是在类本身内部定义的一样,它需要我self.lst作为代码的一部分使用。但是,一旦我超越类并开始在外部使用它,我就必须将一个对象附加到它,该对象创建要调用的实例。因为我认为我是对的,因为它不起作用,所以我知道我错了,因此被卡住了。如果我措辞怪异或者我的理解有误,请原谅我。如果是这样的话,如果你能纠正我,我将不胜感激。

预先感谢您帮助我以及耐心地教我!

解决了

正如@Codesidian 所指出的,for files in glob.iglob(os.path.join(dir, ".csv")):它缺少开始搜索的模式。所以正确的代码应该是在之前添加for files in glob.iglob(os.path.join(dir, "* .csv")):by 的地方。谢谢@Codesidian!*.csv



holdtom
浏览 124回答 1
1回答

当年话下

这一行:for files in glob.iglob(os.path.join(dir, ".csv")):具体来说:不进行波浪号扩展,但 *、? 和用 [] 表示的字符范围将被正确匹配。您输入到函数中的是dir/.csv. 那不是一个模式。你应该添加的是:for files in glob.iglob(os.path.join(dir, "*.csv")):那将是用dir/*.csv. 我已经在本地进行了测试,除了星号外没有任何变化,而且效果很好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python