Python-如果不知道扩展名,如何在文件夹中找到文件?

时间:2019-12-26 05:55:53

标签: python macos

假设我拥有文件扩展名除外的完整路径:

FileNoExt = "/Users/username/Desktop/song"

我需要检索完整路径包括文件扩展名,并将其传递给变量:

FileWithExt = "/Users/username/Desktop/song.mp3"

我在stackexchange上发现了很多类似的问题;但是,所有答案似乎都不起作用。我在macOS上使用PyCharm。

3 个答案:

答案 0 :(得分:2)

您可以像使用glob模块一样

>>> import glob
>>> file_wo_ext = '/home/xxx/python/doc'
>>> glob.glob(file_wo_ext + '*')
['/home/xxx/python/doc.comments', '/home/xxx/python/doc.fornow']

或者,如果您习惯了pathlib,则可以执行类似的操作

>>> import pathlib
>>> file_wo_ext = '/home/xxx/python/doc'
>>> p = pathlib.Path(file_wo_ext)
>>> p.parent
PosixPath('/home/xxx/python')
>>> p.stem
'doc'
>>> list(p.parent.glob(p.stem + '*'))
[PosixPath('/home/xxx/python/doc.comments'), PosixPath('/home/xxx/python/doc.fornow')]

答案 1 :(得分:0)

下面是一个更长但更易于理解的解决方案,显示了“幕后”发生的一些情况;它检索filename首次匹配的绝对路径(带有扩展名):

import os

def get_fullpath(path_wo_ext):
    target_name = path_wo_ext.split(os.sep)[-1]         # os.sep == "/" for your OS
    folderpath  = path_wo_ext.replace(target_name, '')  # exclude name to get folderpath
    filenames   = sorted(os.listdir(folderpath))        # get all filenames w/ extensions,
                                                        # and sort for consistency
    return [os.path.join(folderpath, name) for name filenames
                                           if name in filename][0]

fullpath = get_fullpath("/Users/username/Desktop/song")

要返回所有匹配项,请删除[0]

答案 2 :(得分:0)

尽管Han Solo的答案似乎更好,但这是另一种方法。您可以迭代文件夹的内容并检查文件名是否与任何文件的开头匹配:

import os

FileNoExt = "/Users/username/Desktop/song"
directory, prefix = FileNoExt.rsplit('/',1)
for f in os.listdir(directory):
    if f.starswith(prefix):
        FileWithExt = os.path.join(directory,f)
        break

注意:

这将仅包含以前缀开头的文件,但扩展名前可能包含其他字符,并且一旦找到一个匹配项便会中断。如果希望所有文件都带有前缀,则可以将每个匹配的大小写追加到列表中。您还可以使用endswith检查特定的扩展名。