【Python学习笔记:12】代码练习:文件操作(续)

打印文件夹下的所有目录

方式一:依次遍历

代码

# 打印文件夹下的所有目录

import os

fir_dirs = os.listdir('./books')
for fir_dir in fir_dirs:
    fir_path = os.path.join('./books', fir_dir)
    sec_dirs = os.listdir(fir_path)
    for sec_dir in sec_dirs:
        sec_path = os.path.join('./books', fir_dir, sec_dir)
        thr_dirs = os.listdir(sec_path)
        for thr_dir in thr_dirs:
            thr_path = os.path.join('./books', fir_dir, sec_dir, thr_dir)
            print(thr_path)
    pass

输出

image.png

方式二:glob

/*是获取当前目录列表,也可指定检索的文件格式,如 /*.txt

代码

import glob

file_paths = glob.glob('./books/*/*/*')
print(file_paths)

输出

['./books\\food\\breakfast\\breakfast0.txt', './books\\food\\breakfast\\breakfast1.txt', './books\\food\\dinner\\dinner0.txt', './books\\food\\dinner\\dinner1.txt', './books\\food\\lunch\\lunch0.txt', './books\\food\\lunch\\lunch1.txt', './books\\IT\\AI\\AI0.txt', './books\\IT\\coder\\coder0.txt', './books\\IT\\PM\\PM0.txt']

批量重命名文件

os.listdir(path='.')可获取当前路径的所有文件名
os.path.join(path, *paths)拼接一个或多个路径

# 2 批量重命名文件

import os

fir_dirs = os.listdir('./books')
for fir_dir in fir_dirs:
    fir_path = os.path.join('./books', fir_dir)
    sec_dirs = os.listdir(fir_path)
    for sec_dir in sec_dirs:
        sec_path = os.path.join('./books', fir_dir, sec_dir)
        thr_dirs = os.listdir(sec_path)
        for i, thr_dir in enumerate(thr_dirs):
            thr_path = os.path.join('./books', fir_dir, sec_dir, thr_dir)
            file_new_name = os.path.join(sec_path, sec_dir) + str(i) + '.txt'
            os.rename(thr_path, file_new_name)
            # print(thr_dir)
    pass

批量重命名文件功能运行前

}~1M86CN$W{K{N`7HM2MK0Q.png

批量重命名文件功能运行后

image.png

按要求把数据写入文件,输出对应文件样式

代码

# 按要求把数据写入文件
"""
1 按照以下数据写入文件
data = [
    ['path', 'x', 'y', 'w', 'h'],
    ['1.png', '100', '100', '200', '200'],
    ['2.png', '50', '100', '100', '100'],
    ['3.png', '200', '50', '150', '100'],
    ['4.png', '150', '100', '100', '100'],
]

2 输出对应文件样式
path    x   y   w   h
1.png   100 100 200 200
2.png   50  100 100 100
3.png   200 50  150 100
4.png   150 100 100 100

3 数据读取出来存储在data_dic中
data_dic = {
    '1.png': [100, 100, 200, 200],
    '2.png': [50, 100, 100, 100],
    '3.png': [200, 50, 150, 100],
    '4.png': [150, 100, 100, 100]
}
"""

data = [
    ['path', 'x', 'y', 'w', 'h'],
    ['1.png', '100', '100', '200', '200'],
    ['2.png', '50', '100', '100', '100'],
    ['3.png', '200', '50', '150', '100'],
    ['4.png', '150', '100', '100', '100'],
]

with open('./data.txt', 'w', encoding='utf-8') as file:
    for infos in data:
        file.write(infos[0] + '|' + infos[1] + '|' + infos[2] + '|' + infos[3] + '|' + infos[4] + '\n')
        pass

with open('./data.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    # print(lines)
    for line in lines:
        line = line.strip().split('|')
        for info in line:
            print(info + '\t', end='')
            pass
        print()

data_dic = {}
with open('./data.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    for line in lines:
        line = line.split('|')
        if line[0] == 'path':
            continue

        key = line[0]
        value = line[1:]
        data_dic[key] = value
        pass

print(data_dic)

运行前

image.png

运行后

原本设定是,设定了写入的文本样式,根据文本数据,输出要求的样式
改进为:写入文件样式,即为要求的样式
image.png

参考代码

优化代码参考:优化操作文件的次数和速度

代码

# 按要求把数据写入文件
"""
1 按照以下数据写入文件
data = [
    ['path', 'x', 'y', 'w', 'h'],
    ['1.png', '100', '100', '200', '200'],
    ['2.png', '50', '100', '100', '100'],
    ['3.png', '200', '50', '150', '100'],
    ['4.png', '150', '100', '100', '100'],
]

2 输出对应文件样式
path    x   y   w   h
1.png   100 100 200 200
2.png   50  100 100 100
3.png   200 50  150 100
4.png   150 100 100 100

3 数据读取出来存储在data_dic中
data_dic = {
    '1.png': [100, 100, 200, 200],
    '2.png': [50, 100, 100, 100],
    '3.png': [200, 50, 150, 100],
    '4.png': [150, 100, 100, 100]
}
"""

data_list = [
    ['path', 'x', 'y', 'w', 'h'],
    ['1.png', '100', '100', '200', '200'],
    ['2.png', '50', '100', '100', '100'],
    ['3.png', '200', '50', '150', '100'],
    ['4.png', '150', '100', '100', '100'],
]


with open('./data.txt', 'w', encoding='utf-8') as file:
    for data in data_list:
        data_str = '\t'.join(data)
        file.write(data_str + '\n')
        pass


data_dic = {}
with open('./data.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    for line in lines:
        line = line.replace('\t', ' ').strip().split(' ')
        if line[0] == 'path':
            continue

        key = line[0]
        value = line[1:]
        data_dic[key] = value
        pass

print(data_dic)

输出

image.png

设计函数 训练集和测试集图片 存入列表

目录图

image.png

代码

# 设计函数 训练集和测试集图片 存入列表
"""
目录信息
date_set: test train

test: 0 1 2
0: cat5.png cat7.png
1: liukanshan1.jpg liukanshan3.jpg
2: liukanshan5.jpg liukanshan7.jpg

train: 0 1 2
0: cat0.png cat2.png
1: cat4.png cat6.png
2: cat1.png cat3.png

存储分析
dic = {
    test: [],
    train: []
}

key: test
value: [./data_set\test\0\cat5.png, ...]
"""
import os


def loadDataset():
    dic = {}
    fir_dirs = os.listdir('./data_set')
    for fir_dir in fir_dirs:
        key = fir_dir
        value = []
        fir_path = os.path.join('./data_set', fir_dir)
        sec_dirs = os.listdir(fir_path)
        for sec_dir in sec_dirs:
            sec_path = os.path.join(fir_path, sec_dir)
            thr_dirs = os.listdir(sec_path)
            for thr_dir in thr_dirs:
                thr_path = os.path.join(sec_path, thr_dir)
                value.append(thr_path)

        dic[key] = value

    return dic


data_dic = loadDataset()
print(data_dic)

输出

{'test': ['./data_set\\test\\0\\cat5.png', './data_set\\test\\0\\cat7.png', './data_set\\test\\1\\liukanshan1.jpg', './data_set\\test\\1\\liukanshan3.jpg', './data_set\\test\\2\\liukanshan5.jpg', './data_set\\test\\2\\liukanshan7.jpg'], 'train': ['./data_set\\train\\0\\cat0.png', './data_set\\train\\0\\cat2.png', './data_set\\train\\1\\cat4.png', './data_set\\train\\1\\cat6.png', './data_set\\train\\2\\cat1.png', './data_set\\train\\2\\cat3.png']}

参考代码:设计函数 glob 版

方式一

import glob


def loadDataset():
    dic = {}
    test_list_paths = glob.glob('./data_set/test/*/*')
    train_list_paths = glob.glob('./data_set/train/*/*')
    dic['test'] = test_list_paths
    dic['train'] = train_list_paths
    return dic


data_dic = loadDataset()
print(data_dic)

方式二

import glob


def loadDataset():
    dic = {}
    data_dirs = glob.glob('./data_set/*/*/*')

    for data_dir in data_dirs:
        line = data_dir.split('\\')
        data_type = line[1]
        if data_type not in dic:
            dic[data_type] = [data_dir]
        else:
            tmp = dic[data_type]
            tmp.append(data_dir)

    return dic


data_dic = loadDataset()
print(data_dic)

读取文件 train.txt 内容 使用\t分割

代码

# 读取文件 train.txt 内容 使用\t分割
"""
train_0.jpg	[{"transcription": "三只松鼠", "points": [[23, 46], [181, 234], [124, 245], [46, 81]]}]
train_1.jpg	[{"transcription": "蜜雪冰城", "points": [[123, 106], [281, 434], [424, 645], [147, 1081]]}]
train_2.jpg	[{"transcription": "百草味", "points": [[18, 52], [136, 213], [35, 86], [445, 1325]]}]
train_3.jpg	[{"transcription": "良品铺子", "points": [[1532, 1354], [239, 493], [577, 368], [1008, 499]]}]
train_4.jpg	[{"transcription": "好利来", "points": [[783, 689], [1335, 468], [681, 201], [1207, 2067]]}]

"""
import json


class Food:
    def __init__(self, img_name, transcription, points):
        self.img_name = img_name
        self.transcription = transcription
        self.points = points


food_list = []
with open('./train.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    for line in lines:
        data_infos = line.strip().split('\t')
        img_name = data_infos[0]
        # 列表嵌套 键值对数据 的字典
        data_json = data_infos[1]
        # json --> python object
        infos = json.loads(data_json)
        # 打断点查看数据信息
        food_dic = infos[0]
        transcription = food_dic['transcription']
        points = food_dic['points']
        # print(img_name, transcription, points)
        food = Food(img_name, transcription, points)
        food_list.append(food)
        pass

for food in food_list:
    print(food.img_name, food.transcription, food.points)
    pass

输出

image.png

学生信息 json 版

代码

# 3 学生信息
import json


class Student:
    def __init__(self, name, age, tel, score, sex):
        self.name = name
        self.age = age
        self.tel = tel
        self.score = score
        self.sex = sex
        pass

    def getScore(self):
        return f'name: {self.name} score: {self.score}'

    def getStudent(self):
        return f'name: {self.name} age: {self.age} tel: {self.tel} score: {self.score} sex: {self.sex}'


std_list = []
with open('./std_infos.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    for std_info in lines:
        infos_json = std_info.strip()
        infos = json.loads(infos_json)
        name = infos['name']
        age = infos['age']
        tel = infos['tel']
        score = infos['score']
        sex = infos['sex']
        # print(name, age, tel, score, sex)
        std = Student(name, age, tel, score, sex)
        std_list.append(std)
        pass

for std in std_list:
    print(std.getStudent())
    pass

输出

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饭碗、碗碗香

感谢壮士的慷概解囊!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值