python - 通过 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:
我试过的
我已经尝试在我可以打印的代码的每个部分进行打印。一切正常,直到打印
dir
,但它以某种方式没有注册 for 循环。我尝试使用此代码,这是获取目录中文件列表的不同方法。
onlyfiles = [f for f in os.listdir(dir) if os.path.isfile(os.path.join(dir,f))]
. 这很有效,它打印了我需要的东西,我可能会对其进行调整以仅获取 .csv 文件,但我认为我不能休息,直到我了解我最初尝试做错了什么。我还尝试将函数移出类或完全删除函数以仅使用
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
解决方案
这一行:
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
. 我已经在本地进行了测试,除了星号之外没有任何变化,并且效果很好。
推荐阅读
- c# - 如果我的 MDI 表单不是我的启动表单,我该如何实例化它?
- python-3.x - WHERE IN psycopg2 子句未格式化
- javascript - 是否有任何选项可以在 Google Sheets 脚本或其他程序中使用 javascript 编写代码来对附加组件工具执行一些操作?
- rust - 处理传递给程序宏的编译时相关文本文件的正确方法
- c# -
如何在 xslt 代码中检查 line feed() afterTag 并需要替换为 to标记 - jmeter - JMeter:CSV 数据集配置“在每次测试迭代开始时读取行。” - 它应该如何工作?
- c# - 我如何序列化类字段的值
- php - PHP - 生成数字组(3次迭代,组必须是唯一的)
- c++ - How to link ncurses in Visual Studio 2019 (WSL project)
- google-bigquery - Table partitioning using the Kafka Connect GCP BigQuery Sink Connector