Python:根据部分文件名获取完整的文件名

4
在一个目录中,有两个文件的名称大部分相同:
my_file_0_1.txt
my_file_word_0_1.txt

我想要打开my_file_0_1.txt
我需要避免指定确切的文件名,相反地,我需要搜索该目录以找到与部分字符串my_file_0匹配的文件名。
这个答案这个答案中,我尝试了以下内容:
import numpy as np
import os, fnmatch, glob

def find(pattern, path):
        result = []
        for root, dirs, files in os.walk(path):
                for name in files:
                        if fnmatch.fnmatch(name, pattern):
                                result.append(os.path.join(root, name))
        return result

if __name__=='__main__':

        #filename=find('my_file_0*.txt', '/path/to/file')
        #print filename
        print glob.glob('my_file_0' + '*' + '.txt')

对我来说,这两个选项都无法打印出实际的文件名,以便我稍后使用np.loadtxt读取。

基于字符串匹配的结果,我如何找到并存储文件的名称?


2
glob.glob жҳҜдёӘеҘҪеҠһжі•пјҢжҲ‘и§үеҫ—гҖӮglob.glob('my_file_0*.txt') иҝ”еӣһдёҖдёӘж–Ү件еҗҚеҲ—иЎЁпјҢдҪҝз”Ёзҙўеј•жқҘиҺ·еҸ–дҪ йңҖиҰҒзҡ„ж–Ү件гҖӮ - vaultah
同意。glob.globfnmatch的包装器,但它是一个包装器,可以在此处完全满足您的需求。 - Adam Smith
@StatsSorceress请确保您在运行脚本的目录中拥有这些文件,因为glob应该可以工作。 - Dmitry Senkovich
3个回答

4

glob.glob() 需要一个路径来高效运行,如果您在另一个目录中运行脚本,则它将无法找到预期的文件。 (您可以使用 os.getcwd() 检查当前目录)

以下代码应该有效:

print glob.glob('path/to/search/my_file_0' + '*.txt')

或者
print glob.glob(r'C:\path\to\search\my_file_0' + '*.txt') # for windows

1

使用os.listdir()的解决方案

你也可以使用os模块来搜索os.listdir()。例如:

import os

partialFileName = "my_file_0"

for f in os.listdir():
    if partialFileName = f[:len(partialFileName)]:
        print(f)

0

我刚刚开发了下面的方法,并且在搜索中看到了你的问题。我认为你可能会喜欢这种方法。我需要的东西和你要求的基本上一样,所以我使用列表推导式和确定只有一个符合我的条件的文件名的期望来得到这个简洁的一行代码。我修改了我的代码以适应你的问题。

import os


file_name = [n for n in os.listdir("C:/Your/Path") if 'my_file_0' in n][0]
print(file)

现在,如果这是在循环/重复调用的情况下,您可以按以下方式进行修改:

for i in range(1, 4):
    file = [n for n in os.listdir("C:/Your/Path") if f'my_file_{i}' in n][0]
    print(file)

或者,更实际一点...

def get_file_name_with_number(num):
    file = [n for n in os.listdir("C:/Your/Path") if f'my_file_{num}' in n][0]
    return file


print(get_file_name_with_number(0))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接