如果文本文件中的行引用了不存在的文件,则将其删除

时间:2018-06-25 23:55:53

标签: python cmd

我有一个文本文件(images1.txt),其中包含.jpg个名称列表,我有一个文件夹(Bones),其中包含.jpg个图像。所有图像名称正好是42个字符(包括文件扩展名),并且每个字符都在包含该名称和有关图像的某些信息的单独行中。例如:

OO75768249870G_2018051_4A284DQ0-011628.jpg,1A4502432KJL459265,emergency
OO75768249870G_2018051_4A284DQ0-011629.jpg,1A451743245122,appointment

.jpg之后的所有内容都是我对照片的个人注释。 Bones包含images1中命名的4,000多个图像中的很多,但不是全部。使用命令提示符或python,如何从images1中删除与Bones文件夹中不存在的图像相对应的行?

谢谢!

3 个答案:

答案 0 :(得分:2)

在python中:

import os

LEN_OF_FILENAME = 42

with open('images1.txt', 'r') as image_file:
    with open('filtered_images1.txt', 'w') as filtered_image_file:
        for line in image_file:
            image_name = line[:LEN_OF_FILENAME]
            path_to_image = os.path.join('Bones', image_name)
            if os.path.exists(path_to_image):
                filtered_image_file.write(line)

假设images1.txtBones位于同一文件夹中,如果在该文件夹中运行上述Python脚本,则会得到filtered_images1.txt。它只会包含在Bones中具有相应图像的行。

答案 1 :(得分:0)

此代码将读取image1.txt中的行,并使用骨骼目录中文件所在的行创建一个image2.txt。

@ECHO OFF
IF EXIST image2.txt (DEL image2.txt)
FOR /F "tokens=1,* delims=," %%f IN ('TYPE "image1.txt"') DO (
    IF EXIST "bones\%%~f" (ECHO %%f,%%g >>"image2.txt")
)
EXIT /B

答案 2 :(得分:0)

我认为最简单的方法是使用findstr command

rem /* Search for lines in file `images1.txt` in a case-insensitive manner that literally begin
rem    with a file name found in the directory `Bones` which in turn matches the naming pattern;
rem    then write all matching lines into a temporary file: */
dir /B /A:-D "Bones\??????????????_???????_????????-??????.jpg" | findstr /LIBG:/ "images1.txt" > "images1.tmp"
rem // Overwrite original `images1.txt` file by the temporary file:
move /Y "images1.tmp" "images1.txt" > nul