python的基本文件操作

1. python文件操作

1.1 批量对文件进行改名

src_path=''      #需要改名的数据集文件夹路径
dst_path=''		#将改名后的数据集放入的文件夹路径
import os
#加载数据集文件夹
files=os.listdir(src_path)
print("文件数量:"len(files))
for i ,filename in enumerate(files):
	#print(filename)
    src=os.path.join(os.path.abspath(src_path),name)#源文件名
    rename=str(i)+'txt'
    dstname=os.join(src,dstname)#目标文件名
    os.rename(src,dst)

##1.2 批量更改图片数据集格式

#如由.jpg改为.png格式
import os 
import PIL.Image as Image

src_path=''      #需要改名的数据集文件夹路径
dst_path=''		#将改名后的数据集放入的文件夹路径
file=os.lisdir(src_path)
for i name in enumerate(file):
    print("图片数量:",len(file))
    path=os.path.join(src_path,name)#获取图片的完整路径
    if(i%100==0):
        print("第{}张".format(i))
    img=Image.open(path)#打开图片
    rename=dst_path+name[0:-4]+'.png'
    img.save(rename)
    
 #注意:如果不通过Image库直接更改图片的后缀名,也可以成功,但是图片在ubuntu系统上可显示不出来

##1.3 将一个文件夹下的文件名写到一个.txt文件下

import os
folder_path=''	#需要处理的文件夹路径
files=os.lisdir(folder_path)
print("文件夹下的文件数量:",len(files))

dst_file=open('文件路径','w')		#打开一个文件,接下将文件名写入到这个文件中
for filename in files:
    dst_file.write(filename.split('.')[0]+'\n')	#使用split()函数去除掉文件扩展名

1.4 将文件下的某个文件删除

import os
file_path=''
os.remove(file_path)

#注意:这个函数可以用来对某个数据集中的数据进行清洗删除使用

1.5 json文件转换为单个的.xml文件

#问题描述
将BDD整个数据集的标签文件-json文件(一个包含了70000张图片的信息),转换成voc数据中的.xml文件(为每张图片生成单独的.xml标注文件)
#json文件结构描述
整个大json文件是个列表,每一张图片被一个{}圈起来,每张图片里面有很多属性,例如:name,attributes,labels,····,这些都是字典的格式;label里面是一个列表的结构,每一个物体目标为一个{},里面包含了图片的类别和坐标信息,例如:category,box2d。


[
    {
        "name": "0000f77c-6257be58.jpg",
        "attributes": {
            "weather": "clear",
            "scene": "city street",
            "timeofday": "daytime"
        },
        "timestamp": 10000,
        "labels": [
            {
                "category": "traffic light",
                "attributes": {
                    "occluded": false,
                    "truncated": false,
                    "trafficLightColor": "green"
                },
                "manualShape": true,
                "manualAttributes": true,
                "box2d": {
                    "x1": 1125.902264,
                    "y1": 133.184488,
                    "x2": 1156.978645,
                    "y2": 210.875445
                },
                "id": 0
            },
            {
                "category": "traffic sign",
                "attributes": {
                    "occluded": false,
                    "truncated": false,
                    "trafficLightColor": "none"
                },
                "manualShape": true,
                "manualAttributes": true,
                "box2d": {
                    "x1": 1101.731743,
                    "y1": 211.122087,
                    "x2": 1170.79037,
                    "y2": 233.566141
                },
                "id": 2
            },
            
            {
                "category": "car",
                "attributes": {
                    "occluded": false,
                    "truncated": false,
                    "trafficLightColor": "none"
                },
                "manualShape": true,
                "manualAttributes": true,
                "box2d": {
                    "x1": 45.240919,
                    "y1": 254.530367,
                    "x2": 357.805838,
                    "y2": 487.906215
                },
                "id": 4
            }, 
        ]
    },
    {
        "name": "0000f77c-62c2a288.jpg",
        "attributes": {
            "weather": "clear",
            "scene": "highway",
            "timeofday": "dawn/dusk"
        },
        "timestamp": 10000,
        "labels": [
            {
                "category": "traffic sign",
                "attributes": {
                    "occluded": false,
                    "truncated": false,
                    "trafficLightColor": "none"
                },
                "manualShape": true,
                "manualAttributes": true,
                "box2d": {
                    "x1": 250.549246,
                    "y1": 294.619798,
                    "x2": 308.085801,
                    "y2": 357.05308
                },
                "id": 11
            },
            {
                "category": "traffic sign",
                "attributes": {
                    "occluded": true,
                    "truncated": false,
                    "trafficLightColor": "none"
                },
                "manualShape": true,
                "manualAttributes": true,
                "box2d": {
                    "x1": 206.478694,
                    "y1": 299.516526,
                    "x2": 221.16888,
                    "y2": 321.551802
                },
                "id": 12
            },
            
import os, sys
import json
import cv2
import random
import numpy as np


src_label_dir = 'G:/dataset/wm/Labels/bdd100k_labels_images_val.json'  ###指向数据集的json文件夹

out_xml_dir = 'G:/dataset/wm/BDD_to_VOC/val2_xml'  ###指向voc数据集的Annotations文件夹

f = open(src_label_dir, encoding='utf-8')
#加载json文件
content = json.load(f)
#打印里面图片的数量
print(len(content))

for j in range(len(content)):
#for j in range(2):
    #根据字典的结构,获取图片的名称
    content[j]['name'] = content[j]['name']
    img_path = content[j]['name']
    img_name = os.path.basename(img_path)
    (img_name, extension) = os.path.splitext(img_name)

    #获取图片的绝对路径
    #img_path = os.path.join('G:/dataset/wm/Images/100k/train', img_path)
    #获取图片的尺寸大小
    #height, width = cv2.imread(img_path).shape[:2]

    #为每张图片创建一个.xml文件
    xml_file = open((out_xml_dir + '/' + img_name + '.xml'), 'w')
    xml_file.write('<annotation>\n')
    xml_file.write('    <folder>VOC2007</folder>\n')
    xml_file.write('    <filename>' + str(img_name) + '.jpg' + '</filename>\n')  ###若准备的图片为jpg格式则将png替换为jpg
    xml_file.write('    <path>' + str(img_path) + '.jpg' + '</path>\n')  ###若准备的图片为jpg格式则将png替换为jpg
    # xml_file.write('    <size>\n')
    # xml_file.write('        <width>' + str(width) + '</width>\n')
    # xml_file.write('        <height>' + str(height) + '</height>\n')
    # xml_file.write('        <depth>3</depth>\n')
    # xml_file.write('    </size>\n')
    xml_file.write('    <segmented>0</segmented>\n')

    classes=['traffic sign', 'car', 'person', 'bike', 'motor', 'bus']
    count=0
    for i in content[j]['labels']:
        cls = i['category']
        if cls in classes:
            count=+1
            if cls=='traffic sign':
                cls='road_sign'
            if cls=='car' or cls=='bus':
                cls='vehicle'
            if cls=='person':
                cls='pedestrian'
            if cls=='bike' or cls=='motor':
                cls='bicycle'


            xmin = int(i['box2d']['x1'])
            ymin = int(i['box2d']['y1'])
            xmax = int(i['box2d']['x2'])
            ymax = int(i['box2d']['y2'])


            xml_file.write('    <object>\n')
            xml_file.write('        <name>' + str(cls) + '</name>\n')
            xml_file.write('        <pose>Unspecified</pose>\n')
            xml_file.write('        <truncated>0</truncated>\n')
            xml_file.write('        <difficult>0</difficult>\n')
            xml_file.write('        <bndbox>\n')
            xml_file.write('            <xmin>' + str(xmin) + '</xmin>\n')
            xml_file.write('            <ymin>' + str(ymin) + '</ymin>\n')
            xml_file.write('            <xmax>' + str(xmax) + '</xmax>\n')
            xml_file.write('            <ymax>' + str(ymax) + '</ymax>\n')
            xml_file.write('        </bndbox>\n')
            xml_file.write('    </object>\n')

    xml_file.write('</annotation>')
    xml_file.close()

    #最后判断一下,如果该张图片中没有我们需要检测的物体,既没有位置标签,就不要为这张图片生成xml文件,进行删除
    if count==0:
        os.remove('G:/dataset/wm/BDD_to_VOC/val2_xml/'+img_name + '.xml')



##1.6利用文件名从某个文件夹下复制对应文件


import os
import shutil
file_path='G:/dataset/VOCdevkit/VOC2007/ImageSets/Main/bicycle_val.txt'#文件名称所在的txt文件所在路径
images_path='G:/dataset/VOCdevkit/VOC2007/JPEGImages/'#源文件的地址
dst_path='G:/dataset/VOCdevkit/VOC2007/bicycle_val'#复制文件的存放地址


with open(file_path) as f:
    lines = f.readlines()#读取txt的每一行,返回结果是list,每一行是一个元素
    print(type(lines))
    count=0#统计需要复制的文件数目
    for filename in lines:
        filename=filename.replace('\n','').split(' ')#去除每一行的换行符
        #filename[1]=filename[1].replace('\n','')
        print(filename)
        if(filename[-1]=='1' or filename[-1]=='0' ):
            count+=1
            img_name=filename[0]+'.jpg'
            img_path=os.path.join(images_path,img_name)
            print(img_path)
            new_img_path=os.path.join(dst_path,img_name)
            shutil.copyfile(img_path,new_img_path)  # 将需要的文件从oldname复制到newname

    print("一共有{}张自行车图片".format(count))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值