python练习——生成文件夹中文件名txt(读写文件,拆分合并字符串)

脚本功能

朋友做深度学习训练,需要对文件夹下所有图片文件进行记录,并且每个子文件夹内的图片属于一类,单独设置标签,将文件名 标签输出成filename_label.txt,训练时要求乱序,并且文件名和标签分别输入,即将其乱序并输出成filename.txtlabel.txt

涉及的语法

#将两个字符串组合,返回值为组合后的字符串
os.path.join(path,filename)
#获取指定路径下所有文件的文件名,并保存在list中
list=os.listdir(path)
#判断某个字符串路径是不是文件夹,返回bool
os.path.isdir(path)
#String.split函数,用于分裂字符串,返回值是一个list,保存了分裂后的多个子字符串
#下例代表将String从符号"/"分割,并取最后一部分
String.split("/")[-1]
#list的添加操作
list.append(String)
#打开文件操作,第二个参数是打开方式
#t 文本模式;x 写模式;b 二进制模式;+ 可读可写;U 通用换行模式;r 只读方式(光标放在文件开头)
#r+ 读写模式;w 写模式,覆盖;w+ 读写模式,覆盖;a 写模式,追加;a+ 读写模式,追加
#以上模式符号加上‘b’之后,表示以二进制操作文件
#打开后file即成为文件对象,操作完毕需要close
file=open('filepath','r+')
file.write("abc")
file.close
#另一种打开文件的方法, 且不需要close
with open('path','mode')as fp:
	fp.write("abc")
#String.strip方法,移除字符串首尾的指定符号
String=String.strip('\n')
#String.rfind函数返回字符串中最后一次出现某字符的位置index
index=str.rfing('.')
#打乱list中各项的顺序
random.shuffle(list)

代码实现

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import time
import os
import shutil
import random

def readFilename(path, allfile,label):  #读取文件名函数(输入:文件夹路径,一个列表,标签信息)
    filelist = os.listdir(path)         #获取path下的所有文件名存入filelist中
    i=label                            
    for filename in filelist:         #遍历filelist
        filepath = os.path.join(path, filename)  #将路径和文件名组合
        if os.path.isdir(filepath):   #如果组合后仍旧是文件夹
            readFilename(filepath, allfile,i)  #递归调用自己,即找到文件为止
            i = i + 1                         #并且没递归一次(找到一个新文件夹),label值i改变
        else:
            file_cls = filepath.split("/")[-1].split(".")[-1]  
            if file_cls == 'png':
                filepath = filepath + ' ' + str(int(label)) + '\n'  #生成字符串“名字+标签”
                allfile.append(filepath)  #将filepath写入allfile中			
    return allfile

def ReadFileDatas():
    FileNamelist = []
    file = open('filename_label.txt','r+')  #只读方式打开文件
    for line in file:           #对于文件中的每一行
        line=line.strip('\n')   #删除每一行的\n
        FileNamelist.append(line)  #存入list中
    print('len ( FileNamelist ) = ' ,len(FileNamelist))  #打印txt的行数(即list的长度)
    file.close()  #关闭文件
    return FileNamelist   #返回list
 
def WriteDatasToFile(listInfo):    #传入参数为上边函数的list
    file_filename=open('filename.txt',mode='w')   #打开filename.txt
    file_label=open('label.txt',mode='w') 
    for idx in range(len(listInfo)):      #对于list中每一项
        str = listInfo[idx]             #使用str获取该项字符串
        ndex = str.rfind(' ')   #str.rfind('A')函数,返回str中最后一次出现A的位置,A可以替换成任意字符
        #print('ndex = ',ndex)
        filename = str[:(ndex)]
        print(filename)
        
        label = str[(ndex+1):]       #从'_'字符之后截取内容
        print(label)  
        
        
        file_filename.write(filename+'\n')
        file_label.write(label+'\n')
        
    file_filename.close()
    file_label.close()


if __name__ == '__main__':
    path1 = "D:\\test"       #确定文件夹路径
    allfile1 = []            #创建list用来存储文件名
    allfile1 = readFilename(path1,allfile1,0)
    allname1 = []
    txtpath = "D:\\test\\" + "filename_label.txt"  #创建txt文件list.txt
    print(txtpath)
    with open(txtpath,'w')as  fp:
        fp.write("")
    for name in allfile1:  #遍历allfile1中每一项
        print(name)
        #file_cls = name.split("/")[-1].split(".")[-1]  #获取后缀(以“/”为分隔符保留最后一段,在以“.”为分隔符保留最后一段)
        #if file_cls == 'png':
            #print(name.split("/")[-1])  #打印文件名
        with open(txtpath, 'a+') as fp:  #以a+(追加模式,即打开时光标位于文件尾部)打开刚才创建的txt文件
            #fp.write("".join(name) + "\n")
            fp.write("".join(name))
            
    listFileInfo = ReadFileDatas()
    #打乱列表中的顺序
    random.shuffle(listFileInfo)
    WriteDatasToFile(listFileInfo)

你可能感兴趣的:(Python学习)