想用 Python 获取文件名 吗?这事儿其实挺简单的,但如果你想玩出花儿来,那就得好好研究研究了。别着急,我这就给你掰开了揉碎了讲讲,保准你看了就能上手。
最基础的方法,当然是 os
模块。这可是 Python 自带的宝贝,专门用来和操作系统打交道。用 os.listdir()
可以列出指定目录下的所有文件和文件夹,然后你就可以自己筛选出文件名了。
“`python
import os
dir_path = ‘/path/to/your/directory’ # 替换成你的目录
all_items = os.listdir(dir_path)
file_names = [item for item in all_items if os.path.isfile(os.path.join(dir_path, item))]
print(file_names)
“`
这段代码,先导入了 os
模块,然后指定了一个目录路径。os.listdir()
就像一个好奇的家伙,把这个目录下所有的东西都扒拉了出来,包括文件和文件夹。接着,我们用列表推导式,像一个细心的侦探一样,逐个检查这些“东西”,只有确定是文件(os.path.isfile()
)的,才会被保留下来,放进 file_names
这个列表里。最后,把这个列表打印出来,你就看到了所有的文件名了。
但是,问题来了。如果你只想获取特定类型的文件名,比如 .txt
文件,怎么办呢?这时候,os.path.splitext()
就派上用场了。它可以把文件名和扩展名分开,让你轻松判断文件类型。
“`python
import os
dir_path = ‘/path/to/your/directory’
txt_files = [f for f in os.listdir(dir_path) if f.endswith(‘.txt’)]
print(txt_files)
“`
瞧,这样就只获取 .txt
文件了!endswith()
方法就像一个挑剔的顾客,只接受以 .txt
结尾的文件名。
再进一步,如果目录下面还有子目录,而你想递归地获取所有 .txt
文件名,那就要用到 os.walk()
了。这个函数会像一个勤劳的园丁,一层一层地遍历目录树,把每个角落都翻出来。
“`python
import os
dir_path = ‘/path/to/your/directory’
txt_files = []
for root, _, files in os.walk(dir_path):
for file in files:
if file.endswith(‘.txt’):
txt_files.append(os.path.join(root, file)) # 完整的路径
print(txt_files)
“`
注意,这里我们用 os.path.join()
把目录路径和文件名拼接起来,得到了文件的完整路径。这很重要,因为在递归遍历时,只知道文件名是不够的,你需要知道文件在哪个目录下。
除了 os
模块,glob
模块也是一个不错的选择。它可以使用通配符来匹配文件名,更加灵活。
“`python
import glob
dir_path = ‘/path/to/your/directory’
txt_files = glob.glob(dir_path + ‘/*/.txt’, recursive=True)
print(txt_files)
“`
这段代码使用了 glob.glob()
函数,配合 **/*.txt
这个通配符,可以递归地匹配所有 .txt
文件。recursive=True
参数表示开启递归模式。
其实,pathlib
模块是 Python 3.4 之后才引入的,它用面向对象的方式来操作文件和目录,更加现代化。
“`python
from pathlib import Path
dir_path = Path(‘/path/to/your/directory’)
txt_files = [str(f.resolve()) for f in dir_path.rglob(‘*.txt’)]
print(txt_files)
“`
这里,我们首先创建了一个 Path
对象,表示目录路径。然后,使用 rglob()
方法递归地匹配所有 .txt
文件。rglob()
相当于 glob
模块的递归版本,更加方便。str(f.resolve())
将 Path 对象转换为绝对路径字符串,保证了路径的准确性。
当然,获取文件名之后,你可能还想对文件名进行一些处理,比如提取文件名中的关键信息,或者修改文件名等等。这时候,正则表达式就派上用场了。
“`python
import os
import re
dir_path = ‘/path/to/your/directory’
file_names = [f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))]
for file_name in file_names:
match = re.search(r'(\w+)_(\d+).txt’, file_name) # 假设文件名格式是 name_number.txt
if match:
name = match.group(1)
number = match.group(2)
print(f”文件名:{file_name}, 名字:{name}, 数字:{number}”)
“`
这段代码假设文件名的格式是 name_number.txt
,然后使用正则表达式提取了文件名中的名字和数字。re.search()
函数会在文件名中查找匹配的模式,如果找到了,就可以通过 match.group()
方法获取匹配到的内容。
说到底,Python 获取文件名 的方法有很多,选择哪种取决于你的具体需求。如果你只是想简单地列出目录下的文件名,os.listdir()
就够了。如果需要递归遍历,os.walk()
或者 pathlib.rglob()
更加方便。如果需要匹配特定类型的文件名,glob
模块或者 endswith()
方法更加灵活。如果需要对文件名进行复杂的操作,正则表达式是必不可少的工具。
希望这些技巧能帮你更好地使用 Python 获取文件名,让你的编程之路更加顺畅!
评论(0)