【问题标题】:how to get name of a file in directory using python如何使用python获取目录中的文件名
【发布时间】:2015-09-22 04:48:27
【问题描述】:

在名为“export”的文件夹中有一个 mkv 文件。我想要做的是制作一个从该导出文件夹中获取文件名的python脚本。 假设文件夹位于“C:\Users\UserName\Desktop\New_folder\export”。

如何获取名称?

我尝试使用此 os.path.basenameos.path.splitext .. 嗯.. 没有像我预期的那样工作。

【问题讨论】:

  • 为什么os.path.basename 不起作用?你能展示一个它不起作用的示例代码吗?
  • 你能粘贴你的代码吗?

标签: python python-3.x python-2.7 file


【解决方案1】:

os.path 在路径名上实现了一些有用的功能。但它无权访问路径的内容。为此,您可以使用os.listdir

以下命令将为您提供给定路径的内容列表:

os.listdir("C:\Users\UserName\Desktop\New_folder\export")

现在,如果您只想要 .mkv 文件,您可以使用 fnmatch此模块提供对 Unix shell 样式通配符的支持)模块来获取您预期的文件名:

import fnmatch
import os

print([f for f in os.listdir("C:\Users\UserName\Desktop\New_folder\export") if fnmatch.fnmatch(f, '*.mkv')])

正如@Padraic Cunningham 提到的那样,您可以使用glob 模块:

map(path.basename,glob.iglob(pth+"*.mkv"))

【讨论】:

  • 如果你要使用 os.listdir,if f.endswith(".mkv") 就足够了
  • @PadraicCunningham 是的,有一些方法可以完成这项任务,但正如您在 docs.python.org/2/library/fnmatch.html 中看到的那样,而且由于它使用 Unix shell 样式的通配符,我认为它比其他方式更 Python 和更快!你怎么看?
  • map(path.basename,iglob(pth+"*.mkv")) 会更快,内存效率更高
  • .endswith 也更快
  • @PadraicCunningham 是的,我就是这样 如果您只是想提供一种简单的机制来允许在数据处理操作中使用通配符,这通常是一个合理的解决方案。但是对于匹配文件名glob 是正确的方法。
【解决方案2】:

你可以使用glob:

from glob import glob

pth ="C:/Users/UserName/Desktop/New_folder/export/"
print(glob(pth+"*.mkv"))

path+"*.mkv" 将匹配所有以.mkv 结尾的文件。

要获取基本名称,您可以使用 map 或带有 iglob 的列表组合:

from glob import iglob

print(list(map(path.basename,iglob(pth+"*.mkv"))))


print([path.basename(f) for f in  iglob(pth+"*.mkv")])

iglob 返回一个迭代器,因此您不会无缘无故地构建列表。

【讨论】:

  • 谢谢。我像这样使用你的代码 => def list_images(input_dir): return list(map(os.path.abspath, iglob(input_dir + "\\" + "*.jpg"))))
【解决方案3】:

我假设您基本上是在询问如何列出给定目录中的文件。你想要的是:

import os
print os.listdir("""C:\Users\UserName\Desktop\New_folder\export""")

如果有多个文件并且您想要一个以 .mkv 结尾的文件,您可以这样做:

import os
files = os.listdir("""C:\Users\UserName\Desktop\New_folder\export""")
mkv_files = [_ for _ in files if _[-4:] == ".mkv"]
print mkv_files

【讨论】:

    【解决方案4】:

    如果您正在搜索递归文件夹搜索,此方法将帮助您使用os.walk 获取文件名,您也可以使用以下代码获取这些文件的路径和目录。

    import os, fnmatch
    for path, dirs, files in os.walk(os.path.abspath(r"C:/Users/UserName/Desktop/New_folder/export/")):
        for filename in fnmatch.filter(files, "*.mkv"):
            print(filename)
    

    【讨论】:

      【解决方案5】:

      你可以使用 glob

      import glob
      for file in glob.glob('C:\Users\UserName\Desktop\New_folder\export\*.mkv'):
          print(str(file).split('\')[-1])
      

      这将列出所有扩展名为 .mkv 的文件 file.mkv, file2.mkv 等等。

      【讨论】:

        【解决方案6】:

        os.walk 你可以将文件路径读取为列表

        files = [ file_path  for _, _, file_path in os.walk(DIRECTORY_PATH)]
        for file_name in files[0]: #note that it has list of lists
            print(file_name)
        

        【讨论】:

          猜你喜欢
          • 2011-10-31
          • 2022-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          相关资源
          最近更新 更多