利用Python识别txt文本并根据其内容进行文件分类

事情是这样的,有一个图片数据集需要根据分成很多类以便于给其设置标签,但所有的图片都在一个文件里,另外又给了个.txt文件,其中每行都是对应图片的类别。例如第1行对应的第0001.jpg是第14类(每个类都有多张图片),显而易见,.txt文件的行数和图片的总数是相等的。

以下为待分类的文件:请添加图片描述在这里插入图片描述

现在需要根据标签将同类的文件放入同一个文件夹中,如图为分类完成的结果,总览和第一类文件夹:在这里插入图片描述
在这里插入图片描述
其中过滤了图片宽和高小于400的图片,如果不需要将if判断部分注释掉即可,代码如下,

import shutil
import cv2

# 读入分类的标签txt文件
label_file = open("E:\\pythonProject\\data\\train_perfect_preds.txt", 'r')
# 原始文件的根目录
input_path = "E:\\pythonProject\\data\\cars_train"
# 保存文件的根目录
output_path = "E:\\pythonProject\\result"
# 标签数组
#lables = ["Classical", "Rock", "Symphony", "Country"]
paths = ['/fdfs_data/data/', '/fdfs_data/data1/']

trainpath = '/home/*/*/SR/raisr/test'

file_name = "E:\pythonProject\data\cars_train"
def get_img_file(file_name):
    imagelist = []
    for parent, dirnames, filenames in os.walk(file_name):
        for filename in filenames:
            if filename.lower().endswith(
                    ('.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')):
                imagelist.append(os.path.join(parent, filename))
        return imagelist

list = get_img_file(file_name)  #图片的路径数组
#print(list)
# 一行行读入标签文件
data = label_file.readlines()
#data1 = pic_file.readlines()
# 计数用
i = 0


for line in data:
    # 通过空格拆分成数组
    str1 = line.split(" ")
    # 第一个是文件名
    #file_name = str1[0]
    # 第二个是标签类别,并去除最后的换行字符
    #file_label = str1[1].strip()
    file_label = str1[0].strip()
    # 原始文件的路径
    str2=file_label.zfill(5)
    #old_file_path = os.path.join(input_path, str2)
    old_file_path = list[i]
    # 新文件路径
    new_file_path = ""

    # 如果文件名中有test字符,将其保存至test文件夹下的对应标签文件夹中
    #if "test" in file_name:
    new_file_path = os.path.join(output_path, "data6", file_label)
    # 如果文件名中有 train 字符,将其保存至train文件夹下的对应标签文件夹中
    #elif "train" in file_name:
        #new_file_path = os.path.join(output_path, "train", lables[int(file_label) - 1])

    # 如果路径不存在,则创建
    if not os.path.exists(new_file_path):
        print("路径 " + new_file_path + " 不存在,正在创建......")
        os.makedirs(new_file_path)

    # 新文件位置
    new_file_path = os.path.join(new_file_path, str(i))
    img = cv2.imread(old_file_path)
    sp = img.shape
    height = sp[0]
    width = sp[1]
    channel = sp[2]
    # 复制文件
    if height>400 and width >400:
        print("" + str(i) + "\t正在将 " + old_file_path + " 复制到 " + new_file_path)
        shutil.copyfile(old_file_path, new_file_path+'.jpg')
    else:
        print(old_file_path,sp)
    i = i + 1
# 完成提示
print("完成")


```python
在这里插入代码片

文件夹不需要新建,下面的data6即是分类后的文件名,新建一个result空文件夹即可。

new_file_path = os.path.join(output_path, “data6”, file_label)

另外,这里的 old_file_path 已经包含了图片后缀(是根据你原文件的图片后置j给的,我这里都是jpg类型),然后默认分类完的图片类别为.jpg后缀,可自行尝试修改。

shutil.copyfile(old_file_path, new_file_path+‘.jpg’)

大概思路就是定义一个读取图片文件名的方法,然后将所有待分类的图片名全存进list[],识别类别,如果不存在就新建一个以该类别为文件名的new_file_path,然后就是复制文件到该目录下了,整个在list[]循环下进行,大概就是这样了。

第一次想写点可能有用的东西,从前写的博客都是因为课程作业需要,水的一,希望这篇博客能对你能有亿点点帮助。最后说几句题外话,最近觉得Python还是挺有意思的,跟着某个博主整了个类似自动化办公的区域识别然后进行一些简单操作的小脚本,又听说了AI斗地主,也想玩玩,但感觉配置可能有些困难,轻薄本CPU训练效率也会比GPU低很多,加之C盘快炸了,不禁感概自己都装了些什么玩意儿。

另外有部分代码借鉴了下文,因为本人是懒狗,所以代码中有些注释的或非注释的与本文目的无关的内容就不要纠结了。

https://cxhit.blog.csdn.net/article/details/115391008

<think>好的,我现在需要解决用户的问题,即如何根据train.txt、test.txt、val.txt这三个文件中的路径,将原文件夹中的测试集和验证集移动到对应的目标文件夹中。用户提到参考了站内的引用[2],里面提到了划分数据集的方法,所以可能需要参考那篇博客中的思路。 首先,我得理解用户的需求。用户有一个包含所有图片的文件夹,同时有三个文本文件(train.txt、test.txt、val.txt),每个文件里应该列出了属于训练集、测试集和验证集的图片路径。现在需要根据这三个列表,将图片从原文件夹移动到对应的train、test、val子文件夹中。 接下来,我需要考虑如何实现这个操作。可能的步骤包括: 1. 读取每个txt文件中的路径列表。 2. 创建目标文件夹(如果不存在的话)。 3. 遍历原文件夹中的图片,根据路径列表文件移动到对应的目标文件夹。 需要注意的是,文件路径在txt文件中可能是相对路径或者绝对路径。假设txt文件中的路径是相对于原文件夹的相对路径,那么需要正确拼接路径。此外,可能需要处理不同的操作系统路径分隔符问题,比如Windows用反斜杠,而Linux用正斜杠,但Python的os模块可以处理这些。 然后,编写脚本的大致流程: - 导入必要的模块,比如os和shutil。 - 定义原文件夹路径和目标文件夹路径。 - 遍历每个txt文件(train.txt、val.txt、test.txt),读取其中的每一行,获取文件名。 - 对于每个文件名,构造源文件路径和目标路径,然后移动文件。 - 需要确保目标文件夹存在,可以使用os.makedirs()来创建。 - 可能还需要处理文件名的不同情况,比如是否包含扩展名,或者路径中的分隔符是否正确。 可能的错误点包括: - 文件路径不正确导致找不到文件。 - 目标文件夹没有正确创建导致移动失败。 - 重复移动或者遗漏文件。 另外,用户提到参考了引用[2],其中可能提到了类似的方法,比如使用Python脚本移动文件。可能需要参考该博客中的代码结构,但用户现在需要的是根据现有的txt文件来移动,而不是随机划分数据集。 所以,具体的Python脚本可能如下: 1. 遍历每个txt文件(train、val、test)。 2. 对于每个txt文件中的每一行,提取文件名。 3. 将原文件移动到对应的目标子文件夹。 比如,假设原文件夹是`images`,目标子文件夹是`images/train`、`images/val`、`images/test`。那么,对于每个文件路径在train.txt中的文件,将其从`images/文件名`移动到`images/train/文件名`。 在代码中需要注意路径的正确处理。例如,如果txt中的路径是相对路径,可能需要拼接原文件夹路径。或者,如果txt中的路径已经是相对于脚本所在的位置,可能需要调整路径。 此外,用户可能需要保留原始文件夹结构,或者只是将所有文件移动到对应的子文件夹中,不管原来的目录结构如何。假设用户希望将所有文件直接放在各自的train、val、test文件夹下,而不是保留子目录结构。 另外,如果原文件夹中的文件已经被删除或者路径有误,脚本需要处理异常,比如跳过不存在的文件,或者提示错误。 综上,编写脚本的大致步骤: - 定义原文件夹路径和目标子文件夹路径。 - 对于每个数据集类型(train、val、test): - 读取对应的txt文件,获取文件列表。 - 对于每个文件名: - 构造源路径和目标路径。 - 移动文件,同时创建目标目录。 - 处理可能的异常,如文件不存在。 示例代码可能如下: 使用Python的shutil.move函数来移动文件,os.path相关函数来处理路径。 需要确保在移动文件之前,目标文件夹存在,否则会报错。可以使用os.makedirs(target_dir, exist_ok=True)来创建目录。 测试时需要注意路径是否正确,是否有权限问题,以及文件是否已经被移动过导致重复移动等问题。 另外,用户可能需要将图片和对应的标签文件一起移动,但根据问题描述,用户可能只需要移动图片。不过,用户提到在之前的步骤中生成了label标签,所以可能需要同时移动图片和标签。但根据当前问题,用户只询问了移动测试集和验证集图片,可能只需要处理图片。需要根据具体情况判断,但问题中用户没有提到标签文件,所以可能只处理图片。 最后,将代码示例提供给用户,提醒注意事项,如路径的正确性、备份数据等。</think>### 根据txt文件移动数据集的实现方法 #### 步骤说明 1. **创建目标文件夹** 在原始数据集目录下创建 `train`、`val`、`test` 子文件夹,用于存放移动后的文件。 2. **读取路径列表** 解析 `train.txt`、`val.txt`、`test.txt` 中的文件路径。假设这些txt文件中每行记录的是 **相对原始文件夹的路径**(例如 `image1.jpg` 或 `subdir/image2.jpg`)。 3. **批量移动文件** 根据路径列表,将文件从原始目录移动到对应的目标子目录。若文件路径包含子目录,需在目标文件夹中保留相同的目录结构。 #### Python代码实现 ```python import os import shutil # 定义路径 source_dir = "原文件夹路径" # 例如 "/path/to/dataset" target_dirs = { "train": os.path.join(source_dir, "train"), "val": os.path.join(source_dir, "val"), "test": os.path.join(source_dir, "test") } # 创建目标文件夹 for dir_name in target_dirs.values(): os.makedirs(dir_name, exist_ok=True) # 处理每个txt文件 for split_type in ["train", "val", "test"]: txt_file = f"{split_type}.txt" target_dir = target_dirs[split_type] with open(txt_file, "r") as f: for line in f: file_path = line.strip() # 假设txt中路径是相对source_dir的 src_path = os.path.join(source_dir, file_path) if os.path.exists(src_path): # 移动文件保留目录结构 dst_path = os.path.join(target_dir, file_path) os.makedirs(os.path.dirname(dst_path), exist_ok=True) shutil.move(src_path, dst_path) print(f"Moved: {src_path} -> {dst_path}") else: print(f"Warning: {src_path} does not exist") ``` #### 关键注意事项 1. **路径格式验证** 确保txt文件中的路径与原始文件夹中的实际路径完全匹配(包括大小写和分隔符)。 2. **标签文件同步移动** 若需同时移动标签文件(如 `.txt` 标注文件),可在代码中添加逻辑,将图片路径替换为标签路径后执行相同操作。 3. **备份原始数据** 操作前建议备份原始文件夹,防止误操作导致数据丢失。 4. **跨平台兼容性** 使用 `os.path.join()` 处理路径分隔符,确保代码在Windows/Linux/macOS中均可运行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值