首页 > 解决方案 > 通过 OOP 获取目录中的文件不起作用

问题描述

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

背景

我试图将目录中所有 .csv 文件的名称放入列表中,并最终通过 pandas 操作它们。问题是在进行 for 循环glob.iglob(os.path.join(dir, ".csv")并获取特定于这些文件的名称并将其附加到类中声明的列表中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

init = Initial()
init.get_path()
print(init.lst)
print('\n')
print('The following files are found in this directory: ')
for files in init.lst:
    print('\t' + files)

它打印什么

Paste full path to directory here: dir
[]


The following files are found in this directory:

我试过的

  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")):的地方。谢谢@Codesidian!*.csv

标签: pythonpython-3.xlistoopglob

解决方案


这一行:

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

可以在此处找到的 glob 文档说明它使用模式字符串搜索目录。具体来说:

不进行波浪号扩展,但 *、? 和用 [] 表示的字符范围将正确匹配。

您输入到函数中的是dir/.csv. 那不是一种模式。您应该添加的是:

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

那将使用dir/*.csv. 我已经在本地进行了测试,除了星号之外没有任何变化,并且效果很好。


推荐阅读