删除文本文件中作为列表的具有特定扩展名的文件

2024-06-28 19:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试从Web服务器清理一些媒体文件夹。问题是,每个文件都以多个不同的分辨率复制,而且并非所有文件都是相同的

例如:picture1.jpg还有picture1-150x150.jpgpicture1-100x100.jpgpicture1-50x50.jpg。 虽然它们中有很多是相同的,但也有很多是不同的

所以首先我尝试了这个:

import os
    
 dir_name = "path"
 test = os.listdir(dir_name)
    
 for item in test:
    
     if item.endswith("150x150.jpg"):
         os.remove(os.path.join(dir_name, item))

它完成了它的工作,但在添加了各种不同的分辨率和文件扩展名(jpg、jpeg、png、etcpp)后,它变得非常臃肿:

if item.endswith("-150x150.jpg"):
        os.remove(os.path.join(dir_name, item))
 if item.endswith("-100x100.jpg"):
        os.remove(os.path.join(dir_name, item))
 if item.endswith("-75x75.jpeg"):
        os.remove(os.path.join(dir_name, item))
 if item.endswith("-50x50.jpeg"):
        os.remove(os.path.join(dir_name, item))
 
       etc...

所以我试着将这些决议输入一个文本文件,并将其用作列表

import os

dir_name = "path"
folder = os.listdir(dir_name)

with open('list.txt') as f:
    lines = f.read().splitlines()

for file in folder:
    if file.endswith(str(lines)):
        os.remove(os.path.join(dir_name, file))

虽然我能够在一定程度上阅读和修改代码,但在谷歌工作了半天之后,我就做到了这一点。 因此,我恳请您提供任何帮助或指导


Tags: 文件pathnameifosdir分辨率item
3条回答

除了有“-150x150.jpg”的文件名外,还有其他文件名中有破折号吗?如果没有,您可以执行以下操作:

import os

dir_name = "path"
folder = os.listdir(dir_name)

for file in folder:
    split_file_name = file.split('-')
    if len(split_file_name) > 1:
        os.remove(os.path.join(dir_name, file))

如果你不能保证只有一个破折号,那么我认为regex将是你最好的选择

import os
import re

dir_name = "path"
folder = os.listdir(dir_name)

pattern = re.compile('[a-zA-Z0-9_\-]+-\d+x\d+.jpg')

for file in folder:
    if pattern.match(file):
        os.remove(os.path.join(dir_name, file))

方法endswith接受元组作为参数,这意味着您可以将所有扩展组合成单个变量

extensions = ("-150x150.jpg","-100x100.jpg","-75x75.jpeg","-50x50.jpeg")

然后将这个变量传递给endswith

if file.endswith(extensions):
    os.remove(os.path.join(dir_name, file))

以下是我用来证明概念的片段:

files = [
    "file1",
    "file2.jpg",
    "file123",
    "file4.jpg.old",
    "file5.txt"
]

extensions = (
    ".jpg",
    ".exe",
    ".txt"
)

for file in files:
    if file.endswith(extensions):
        print(f'File :{file} should be delete')
    else:
        print(f'Skipping:{file}')

这返回:

╰─ python3 app.py
Skipping:file1
File :file2.jpg should be delete
Skipping:file123
Skipping:file4.jpg.old
File :file5.txt should be delete

我认为您需要浏览行的所有元素

然后,如果文件名中出现列表中的元素,则会将其删除

for file in folder:
    for line in lines:
        if file.endswith(str(line)):
        os.remove(os.path.join(dir_name, file))

相关问题 更多 >