【深度学习】随笔1:将在同一个文件夹中的文件名以及txt中的内容读取出来并保存成CSV

一、使用os.listdir()将文件夹中的所有文件名提取出来,再将提取出来中的文件名中有.txt的提取,使用with open打开txt文件。

import pandas as pd
import numpy as np
from  pandas import DataFrame as df
import os
import math
import keras
'''第一部分,生成train和val的csv文件,方便从中读取图片数据'''
root=r'C:\Users\liulu\Desktop\huaweicloud\file\train_data\train_data'
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
files=os.listdir(root)
files

for file in files: # 前两行:‘img_1.jpg’,img_1.txt’,…
‘’’
类别都在txt文件中,形如:img_101.jpg, 1 ;每一个txt文件中以"."分隔成两列,第一列为图片名,第二列为类别标签
‘’’
print(file)
if ‘.txt’ in file:
‘’’
os.path.join()函数:连接两个或更多的路径名组件
1.如果各组件名首字母不包含’/’,则函数会自动加上
2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
r+:可读可写,若文件不存在将会报错
w+:可读可写,若文件不存在将会创建
‘’’
with open(os.path.join(root,file),‘r+’) as f: # root\file(此file是txt文件的文件名)
line = f.readline() # 每次只读取一行,即将每个txt文件的内容读取出来然后提取出图片名以及标签
filename = str(line).split(’,’)[0]
label = int(str(line).split(’ ')[1])
print(filename)
print(label)

# 将图片名称与标签两个部分分开到两个列表当中去
df_ = df()
Filename = []  # 图片名称列表
Label = []  # 标签列表
for file in files:
    if '.txt' in file:
        with open(os.path.join(root, file), 'r+') as f:
            line = f.readline() # 每次只读取一行,其实也只有一行
            filename = str(line).split(',')[0]  # 名称
            label = int(str(line).split(' ')[1])  # 标签
            Filename.append(filename)
            Label.append(label)
# print(Filename, Label)   
print(type(Filename), type(Label), len(Filename), len(Label))
df_['FileName']=Filename   # 数据框中添加元素
df_['Label']=Label
df_
# 打乱数据框中的元素,其实frac是指随机抽取行的比例,frac = 0.8就是抽取80%
df_ = df_.sample(frac=1.0)
df_.shape
# 分训练集与验证集
print(df_.shape[0]*0.8)
print(math.ceil(df_.shape[0]*0.8))  # 上取整
df_train = df_.iloc[0:math.ceil(df_.shape[0]*0.8),:]
df_val = df_.iloc[math.ceil(df_.shape[0]*0.8):,:]
print(df_train.shape, df_val.shape)
df_train.head()
# 写入csv, 保存到当前路径下
df_train.to_csv('train.csv', index=None) # 不要行索引 
df_val.to_csv('val.csv', index=None)

二 使用glob直接就可以匹配到txt文件

glob是python自己带的一个文件操作相关模块,用它可以查找符合自己目的的文件,类似于Windows下的文件搜索,支持通配符操作,*,?,[]这三个通配符,*代表0个或多个字符,?代表一个字符,[]匹配指定范围内的字符,如[0-9]匹配数字。两个主要方法如下。

glob模块的主要方法就是glob,该方法返回所有匹配的文件路径列表(list);该方法需要一个参数用来指定匹配的路径字符串(字符串可以为绝对路径也可以为相对路径),其返回的文件名只包括当前目录里的文件名,不包括子文件夹里的文件。

import glob
glob.glob(r’c:*.txt’)

获得C盘上的所有txt文件

import os
import math
import codecs
import random
import numpy as np
from glob import glob
from PIL import Image
import pandas as pd
train_data_dir = r'C:\Users\liulu\Desktop\huaweicloud\test'
label_files = glob(os.path.join(train_data_dir, '*.txt'))  # 读取文件中所有的txt文件
random.shuffle(label_files)
img_paths = []    #图片完整路径和标签的空列表
labels = []
train_df = pd.DataFrame()
valid_df = pd.DataFrame()
for index, file_path in enumerate(label_files):
    with codecs.open(file_path, 'r', 'utf-8') as f:
        line = f.readline()
#         print(line)  # 读取txt文件中的内容
        line_split = line.strip().split(', ') 
#         print(line_split)
        if len(line_split) != 2:
            print('%s contain error lable' % os.path.basename(file_path))
            continue
        print(line_split)
        img_name = line_split[0]
        label = str(line_split[1]) 
#         print(img_name)
#         print(label)
        img_paths.append(img_name)
        labels.append(label)
#         print(labels)
        
# print(img_paths)
# print(labels)
train_img_paths = img_paths[50:len(img_paths)]
random.seed(200)
random.shuffle(train_img_paths)
validation_img_paths = img_paths[:500]
random.seed(200)
random.shuffle(validation_img_paths)
print(train_img_paths)
发布了5 篇原创文章 · 获赞 0 · 访问量 10

猜你喜欢

转载自blog.csdn.net/liuluTL/article/details/104936989