Python Shell-删除不带.txt参考的文件

时间:2018-07-07 00:50:47

标签: python shell parsing

我正在尝试编写脚本来检查图像目录并搜索文本文件以查看名称是否显示在其中。如果文本文件中未引用该图像,则我希望脚本删除该图像。这是我到目前为止的内容:

import os
in_gt = False
my_dir = 'C:/{...}/test'
fname = 'C:/{...}file.txt' 
for image_name in os.listdir(my_dir):
    with open(fname, 'r') as gt_file:
        for line in gt_file:
            gt_image_name = line
            if image_name in gt_image_name:
                in_gt = True
    if in_gt == False:
        os.remove(os.path.join(my_dir, fname))

其他信息:在file.txt的每一行中都包含一个图像名称,然后是有关该图像的一些不重要的信息。

问题:

  • 由于我的目录包含数千张照片,而file.txt包含数千行,因此我担心代码的效率。我是Python的新手,所以我对脚本的速度没有信心。
  • 每次运行当前脚本时,它都会在实际完成任何操作之前删除file.txt。为什么这样做,我该如何停止呢?

谢谢!

2 个答案:

答案 0 :(得分:1)

import os
in_gt = False
my_dir = 'C:/{...}/test'
fname = 'C:/{...}file.txt' 
for image_name in os.listdir(my_dir):
    with open(fname, 'r') as gt_file:
        for line in gt_file:
            if image_name in line:
                in_gt = True
                break
    if in_gt == False:
        os.remove(os.path.join(my_dir, image_name))
    else:
        in_gt = False

第二个问题的答案:- 查看您在代码的第三行中声明变量fname的代码,即文件名file.txt,在基于in_gt标志的代码的处,您将删除fname,仅是'file.txt'

答案 1 :(得分:0)

不必为目录中的每个图像文件重新读取file.txt。您应该首先将目录中的文件名放入集合中,然后在阅读file.txt时,从集合中删除文件中出现的所有图像名称,最后删除名称保留在集合中的图像。

import os
import re
my_dir = 'C:/{...}/test'
fname = 'C:/{...}file.txt' 
image_names = set(os.listdir(my_dir))
with open(fname, 'r') as gt_file:
    for line in gt_file:
        for name in image_names:
            if name in line:
                image_names.remove(name)
                break
for name in image_names:
    os.remove(os.path.join(my_dir, name))