我试图编写一个Python脚本,在文件夹中搜索.txt
扩展名的所有文件。在手册中,我只看到它硬编码到glob.glob("hardcoded path")
。
如何使glob搜索模式的目录成为变量?具体来说:用户输入。
这就是我的尝试:
import glob
input_directory = input("Please specify input folder: ")
txt_files = glob.glob(input_directory+"*.txt")
print(txt_files)
尽管给出了包含.txt
文件的正确目录,但该脚本会打印一个空列表[ ]
。
答案 0 :(得分:3)
如果您不确定路径末尾是否包含分隔符号(通常为'/'
或'\'
),则可以使用os.path.join
进行连接。这是一种比手动附加本地操作系统路径分隔符更便携的方法,并且比编写条件更短,以确定是否每次都需要:
import glob
import os
input_directory = input('Please specify input folder: ')
txt_files = glob.glob(os.path.join(input_directory, '*.txt'))
print(txt_files)
答案 1 :(得分:2)
对于Python 3.4+,您可以为此使用pathlib.Path.glob()
:
import pathlib
input_directory = pathlib.Path(input('Please specify input folder: '))
if not input_directory.is_dir():
# Input is invalid. Bail or ask for a new input.
for file in input_directory.glob('*.txt'):
# Do something with file.
在is_dir()
和全局对象之间存在time of check to time of use竞争,不幸的是,这很容易避免,因为glob()
在这种情况下只返回一个空的迭代器。在Windows上,甚至无法避免,因为您无法打开目录来获取文件描述符。在大多数情况下,这可能很好,但是如果您的应用程序具有a different set of privileges from the end user或来自对父目录具有写访问权的其他应用程序,则可能会出现问题。此问题也适用于任何使用glob.glob()
的行为相同的解决方案。
最后,Path.glob()
返回一个迭代器,而不是列表。因此,您需要如图所示对其进行循环,或将其传递给list()
来实现。