【问题标题】:I have a python script to list files in a path, how do I filter files with specific extensions我有一个 python 脚本来列出路径中的文件,如何过滤具有特定扩展名的文件
【发布时间】:2021-03-31 12:22:20
【问题描述】:

我有一个包含文件夹和文件的特定路径。我想过滤掉带有 pdf、docx、jpg 扩展名的文件。

我已经有了一个列出所有文件的脚本。所以我被卡住了。任何可以帮助我过滤掉这些文件的人。

代码如下。

import os
path = r'C:\Users\PacY\Documents'
FileList = []

extensions = ['.pdf', '.docx', '.jpg']


for FileList in os.listdir(path):
    print("\nFiles: ", FileList)

【问题讨论】:

  • 嗯,这是一个非常直接的概念。您使用.split('.') 将名称拆分为.。这将返回一个列表,然后您选择其中的最后一项,然后根据您的需要对其进行评估。
  • 如果您遵循前面提到的代码,您将了解如何评估扩展
  • filename.endswith( ['.pdf', '.docx', '.jpg'] )
  • 你可以使用glob,甚至还有'gif'文件的正则表达式示例:glob.glob('*.gif')

标签: python python-3.x


【解决方案1】:

listdir() 将文件名作为字符串给出,字符串具有函数endswith() (ends with) 可以获取单个字符串(即filename.endswith('.pdf'))或字符串元组(即filename.endswith( ('.pdf', '.docx', '.jpg') )

import os

path = r'C:\Users\PacY\Documents'

extensions = ('.pdf', '.docx', '.jpg')  # has to be tuple instead of list

for filename in os.listdir(path):
    if filename.endswith( extensions ):
        print("filename:", filename)

为了确保您也可以将名称转换为 lower() 以识别 .PDF.Pdf 等。

    if filename.lower().endswith( extensions ):

import os

path = r'C:\Users\PacY\Documents'

extensions = ('.pdf', '.docx', '.jpg')  # has to be tuple instead of list

filtered_filenames = []

for filename in os.listdir(path):
    if filename.lower().endswith( extensions ):
        #print("filename:", filename)
        filtered_filenames.append(filename)
        #filtered_filenames.append( os.path.join(path, filename) )  # full path

print(filtered_filenames)

顺便说一句:

它也适用于具有更多点的扩展 - 例如 .pdf.zip 或在 linux 上流行的 .tar.gz

【讨论】:

    【解决方案2】:

    我会使用split 方法。这是一个打印文件夹中具有这些扩展名之一的所有文件的示例。

    import os
    path = r'C:\Users\PacY\Documents'
    FileList = []
     
    extensions = ['pdf', 'docx', 'jpg']
    
    FileList = os.listdir(path)
    for file in FileList:
        if file.split('.')[-1] in extensions:
           print(file)       
    

    【讨论】:

      【解决方案3】:
      import os
      from os import path
      print(os.path.realpath)
      extension = '.epub'
      dir_path = os.path.dirname(os.path.realpath(__file__))
      # Making list of files with .epub extension
      files = []
      for directory, subdir_list, file_list in os.walk(dir_path):
          for name in file_list:
              if list(name.split("."))[1] == extension.strip("."):
                  files.append(name)
      

      以上代码返回目录和所有子目录所请求扩展名的所有文件的列表。

      【讨论】:

      • 您应该检查[-1] 以使用带有许多点的文件名 - 即。跳过name.pdf.zip 并保留name.other.text.pdf
      【解决方案4】:

      我会以不同的方式编写代码,您可以使用 pathlib。

      import pathlib
      path = r'C:\Users\PacY\Documents'
      extensions = ['pdf', 'docx', 'jpg']
      list(pathlib.Path(path).glob(extensions))
      

      【讨论】:

      • 我没有 Windows,但它不适用于我在使用 Python 3.8、3.9、3.10 的 Linux 上。它需要 glob() 中的单个字符串 - 它需要 *.pdf 而不是 pdf - 比如 glob("*.pdf")
      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多