文件操作小知识点记录--list检查元素、try except、list元素数量统计、文件的复制,移动和删除、txt操作、find删除指定字符、拆分字符串字母和数字、汉子转拼音

目录

1.检查该元素,是否在目标list中:

2. try···except跳出错误的操作

3.统计list(列表)中相同元素的个数

4.对文件进行复制、移动、删除操作

5.读取txt文件,并一行一行的显示出来

6.把字符串string中带有指定字符的删除

7.将字符串,拆分成字母和数字形式

8.python中xpinyin汉字转拼音

9.python统计xml文件中特定字符出现的次数

补充10:将文件夹内的数据,依据文件名的一致性,分别保存到对应的文件夹



1.检查该元素,是否在目标list中:

list_samename=['ChenZhangWei', 'HuangXiaoDon', 'YuYunYuan', 'ZhangWei', 'WangXiao']

int_path = 'F:\\3人TB\\dcmraw'
    for root, dirs, files in os.walk(int_path):
        for filename in files:  # 遍历所有文件

            if filename in list_samename:
                file_path = os.path.join(root, filename)
                print(file_path)

结果:list_samename中存在与filename一模一样的元素,就把filename的完整路径打印出来


2. try···except跳出错误的操作

在日常的处理中,经常遇见不满足操作条件,而出现错误的现象。出现错误,就会主动中断程序,跳出错误提示;

有时候我们并不需要系统那么的热心,自动的帮我们终止执行程序,此时,我们选择,当遇见错误的时候,执行另一段操作,使得程序继续执行

            try:
                ds = pydicom.dcmread(os.path.join(root, filename), force=True)  # 读取dcm

                patient_name = str(ds.PatientName)
                patient_slicenum = str(ds.InstanceNumber)
                slice_thickness = str(round(ds.SliceThickness,3))
                print(slice_thickness)
                new_filename = filename.split(".dcm")[0]+"_"+slice_thickness+".dcm"
                #print("{}***{}***{}".format(patient_name, patient_slicenum, slice_thickness))

                os.rename(os.path.join(root, filename), os.path.join(root, new_filename))
                print(new_filename)

            except:
                print("######################################################" + filename)
                continue

上面这段是干这么一件事情:读取dcm文件(一种医学图像存储格式),取得内部参数,对它重命名

  1. 读取dcm文件
  2. 获取dcm文件内的PatientName、InstanceNumber、SliceThickness三个参数
  3. 组合新的文件名
  4. os.rename重命名

上面执行的这个过程,很可能会出现一些问题,比如

  1. 读取dcm文件不存在
  2. dcm文件被破坏,不存在PatientName参数,或者缺失
  3. 组合新文件名时候出现越界等等人为错误
  4. os.rename重命名失败

只要上面可能出现的错误发生,就会自动的跳出try部分,进入except操作,并continue进入下一轮的循环


3.统计list(列表)中相同元素的个数

任务:这里的字符串名为list_name,打印列表中相同元素数量大于1的名称和数量

def re_add_name():
    a_dict = {}
    list_name=["annan","annan","hh","mam","mam"]
    for i in list_name:
        if list_name.count(i)>1:
            a_dict[i]=list_name.count(i)
    print(a_dict)


4.对文件进行复制、移动、删除、重命名操作

import shutil

# 复制操作
# shutil.copy(原文件完整path,保存到的文件夹完整path)
shutil.copy(os.path.join(root, filename), os.path.join(save_path, '85测试出错原图'))

# 移动操作
shutil.move(os.path.join(root, filename), os.path.join(save_path, '85测试出错原图'))

# 实现对文件的删除
os.unlink(mark_pne_path) 

# 对文件进行重命名
os.rename(os.path.join(root, filename), os.path.join(root, new_filename))

更多详情可参照这里:https://blog.youkuaiyun.com/wsLJQian/article/details/92832695


5.读取txt文件,并一行一行的显示出来

这里如题,不做过多的解释,就是把txt文件内容一行一行的读取显示出来,再干点啥自己决定吧

def readTXT():
    list_name=[]
    for line in open("./list_not_predOK.txt"):
        print(line.strip())

有人该问啦,为什么不直接采用print(line)形式,这是由于每一行都是存在一个换行符的。

这里用到了strip()方法,如下描述

Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。


6.把字符串string中带有指定字符的删除

一堆字符串如下所示,此时不想让下面的字符串中包含IM,也就是把IM这个字符给剔除了,该怎么做呢?这里用到find查询的操作。

xiaobai_CVIMggoo1.png,xiaobai_CVIMggoo2.png,xiaobai_CVIMggoo2.png,xiaobai_CVIMggoo2.png···

def Findname():

    list_name=["xiaobai_CVIMggoo1.png","小白_CVIMggoo2.png","xiaobai_CVIMggoo2.png","小白_CVIMggoo2.png"]

    for name in list_name:  # 遍历所有文件
        print(name)
        pos = name.find("IM")  # 把文件带有_label的字符删除

        print("pos_num:", pos)
        if (pos == -1):
            continue
        newname = name[0:pos] + name[pos+2:-1]+"png"
        print(newname)
        print("***********")

注释:这里的pos返回的是第一次发现目标字符的首位置


7.将字符串,拆分成字母和数字形式

话不多说了,看图,具体的详情可参考这里:https://blog.youkuaiyun.com/wsLJQian/article/details/100987574

其中一个点值得注意,也是个陌生的词---groupby:

pandas提供了一个灵活高效的groupby(Group By: split-apply-combine)功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象。计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。

举例1.列表根据gb这个函数的条件,把list进行了重新的分类

from itertools import groupby

lst=[2,8,6,9,15,16,20,30,65,123,95,12]

def gb(num):
    if num<10:
        return 'less'
    elif num>50:
        return 'great'
    else:
        return 'middle'

print([(k,list(g)) for k,g in groupby(sorted(lst),key=gb)])

 举例2.把list拆分成相互连续的几个list

from itertools import groupby

sorted_list_k=[1,2,3,4,5,12,11,10,9,65,66,64,63,67]
sorted_list_k = sorted(sorted_list_k) # 冒泡排序

fun = lambda x: x[1]-x[0]
for k, g in groupby(enumerate(sorted_list_k), fun):

    list_continuous_slice = [j for i, j in g]  # 连续slice数字的列表
    print(list_continuous_slice)


8.python中xpinyin汉字转拼音

from xpinyin import Pinyin
def readTXT():

    p=Pinyin()
    print(p.get_pinyin(u"小白CV",""))

小字没了,多多见谅啊。


9.python统计xml文件中特定字符出现的次数

 如题,在深度学习领域中经过会用到label标签一个名词,标记的信息类别将以字符的形式保存在xml文件中。

此时若是想要统计,究竟各个类别的数量是多少的时候,仅仅是依靠看看有多少张图片是不够的(因为同一图图像可能会同时包含多种类别,别入car/tree/people等等)

此时,最有效的方式就是对xml文件直接操作,获取一手信息,对各个类别都有一个反应

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import xml.etree.ElementTree as ET

inflection_list=[]
for xml_file in os.listdir("D:/image/voc_inflection4/Annotations/"):
    a, b = os.path.splitext(xml_file)
    tree = ET.parse("D:/image/voc_inflection4/Annotations/" + a + ".xml")
    root = tree.getroot()
    for inflection_name in root.iter('object'):
        target = inflection_name.find('name').text
        inflection_list.append(target)

inflection_set=set(inflection_list)

inflection_dict={}
for i in inflection_set:
    inflection_dict[i]=inflection_list.count(i)

#print(inflection_list)
print(inflection_dict)

今天就到这里,后续将持续更新中,欢迎关注


补充10:将文件夹内的数据,依据文件名的一致性,分别保存到对应的文件夹

def file2document():

    int_path = 'F:\\TB肺结核\\database\\train\\pneumonia_raw'
    flag="(0)"
    for root, dirs, files in os.walk(int_path):
        for filename in files:  # 遍历所有文件
            #print(filename)
            name=filename.split("_")[1]
            if name == flag:
                shutil.copy(os.path.join(root, filename), os.path.join("F:\\TB肺结核\\database\\train\\pne\\", name))
            else:
                #os.mkdir(r"F:\\TB肺结核\\database\\train\\pne\\" + name)
                flag=name
                print(name)


小白CV:公众号旨在专注CV(计算机视觉)、AI(人工智能)领域相关技术,文章内容主要围绕C++、Python编程技术,机器学习(ML)、深度学习(DL)、OpenCV等图像处理技术,深度发掘技术要点,记录学习工作中常用的操作,做你学习工作的问题小助手。只关注技术,做CV领域专业的知识分享平台。
————————————————
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钱多多先森

你的鼓励,是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值