【问题标题】:Open file knowing only a part of its name打开文件只知道其名称的一部分
【发布时间】:2013-08-25 20:06:50
【问题描述】:

我目前正在读取一个文件并使用以下行导入其中的数据:

# Read data from file.
data = np.loadtxt(join(mypath, 'file.data'), unpack=True)

变量mypath 是已知的。问题是文件file.data 会随着时间而改变,假设名称如下:

file_3453453.data
file_12324.data
file_987667.data
...

所以我需要一种方法来告诉代码在该路径中打开名称类似于 file*.data 的文件,假设路径中始终只有该名称的 一个 文件. python 有没有办法做到这一点?

【问题讨论】:

  • 如果有多个同名文件会怎样?
  • 该路径中始终只有一个同名的文件。抱歉,我没有明确说明,我现在会更新问题。
  • 那么,崩溃和烧毁?我知道这很不方便,但你至少应该知道如果这样的假设被打破会发生什么。因为它坏掉。
  • 哈哈好吧,我很确定它不会,因为我是把那个文件放在那里的人,但如果我忘记了,并且路径中有两个具有相同名称约定的文件,那么代码应该会崩溃以提醒我注意。真的,这就是我所需要的。
  • 然后在你把它放在那里的时候重命名它可能会更快地提醒你并简化代码。

标签: python naming


【解决方案1】:

您可以使用glob 模块。它允许对文件名进行模式匹配,并完全按照您的要求进行操作

import glob

for fpath in glob.glob(mypath):
    print fpath

例如,我有一个目录,其中包含名为 google.xml、google.json 和 google.csv 的文件。

我可以像这样使用 glob:

>>> import glob
>>> glob.glob('g*gle*')
['google.json', 'google.xml', 'google.csv']

请注意,glob 使用 fnmatch 模块,但它具有更简单的界面,并且它匹配路径而不是仅匹配文件名。

您可以搜索相对路径,而不必使用os.path.join。在上面的示例中,如果我切换到父目录并尝试匹配文件名,它会返回相对路径:

>>> import os
>>> import glob
>>> os.chdir('..')
>>> glob.glob('foo/google*')
['foo/google.json', 'foo/google.xml', 'foo/google.csv']

【讨论】:

  • 这似乎是一个很好的答案,但它是否允许将文件的结尾部分设置为匹配模式file*.data 还是只使用文件名的第一部分? Sp 使用fnmatch 的回答可以做到我所说的。
  • glob 使用 fnmatch,因此它也匹配其他模式,例如 file*.data。我已经编辑了答案以表明
【解决方案2】:

也可以查看fnmatch:

>>> import fnmatch
>>> import os
>>>
>>> fnmatch.filter(os.listdir('.'), 'file_*.data')
['file_3453453.data']
>>>

【讨论】:

    【解决方案3】:

    我的简单解决方案是使用 python 模块“os”和“re”:

    import os
    import re
    for file in os.listdir(mypath):
         if re.match("file_\d+\.data", file):
         ...
    

    【讨论】:

    • 你需要在你的模式中转义.
    • 你完全正确!固定的。如果没有转义,代码也会匹配名称如“file_123data”的文件。谢谢!
    【解决方案4】:

    试试

    import os
    
    [os.path.join(root, f) for root, _, files in os.walk(mypath)
                           for f in files
                           if f.startswith('file') and f.endswith('.data')]
    

    如果有多个文件,它将返回所有文件file*.data 的列表。你可以遍历它们。如果只有一个文件,则只需将 [0] 放在列表解析的末尾即可。

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多