一、CSV 文件操作
1.1、文件写入
1.1.1、pandas库方法
import pandas as pd
# 任意的多组列表
a = [1,2,3]
b = [4,5,6]
# 字典中的key值即为csv中列名
dataframe = pd.DataFrame({'a_name':a,'b_name':b})
# 将DataFrame存储为csv,index表示是否显示行名,default=True
# sep=','使用了逗号分隔符,依然可以改为制表符'\t'(table),但是需要在读取阶段保持一致
dataframe.to_csv("test.csv",index=False,sep=',')
1.1.2、csv库方法
def saveCSV():
csvfile=open(r'./train_label.csv','w',newline='')
writer=csv.writer(csvfile)
img_path = r"./train"
writer.writerow(['img_path', 'label'])
for (path, dirs, files) in os.walk(img_path):
for filename in files:
img_path=os.path.join(path, filename)
label=img_path.split('/')[-2]
print(img_path, label)
writer.writerow([filename, label])
csvfile.close()
入遇到【Python导出csv文件时,字符型学号变成了科学计数法数字】的情况,可以参考这篇博客:Python导出csv文件时,字符型学号变成了科学计数法数字_哦柯南的博客-CSDN博客
将学号后加上“\t”,相当于告诉表格我是字符不是数字。也就是下面这样:
text+'\t'
1.2、文件读取
1.2.1、 有标题栏的情况
如题,有的时候我们需要对csv或者Excel文件进行处理(Excel也可以另存为CSV文件再操作),一个包含这几千行,几十列的一个表,看着就很头大。但是这个大的一个表中,我们感兴趣的只是那么几列数据。
举个栗子,目标是拿到wordcupmatches.csv文件里面Home team goals和Away team goals两列的数据,如下截图所示:
可以通过第一行的列名,逐行来获取单个信息。读取文件内容代码如下:
file = "D:/小象作业/ml-statistics-quartile/data/WorldCupMatches.csv"
with open(file,'r', encoding = 'UTF-8') as f :
# TODO
# 使用csv.DictReader读取文件中的信息
reader = csv.DictReader(f)
home_team_goals = []
away_team_goals = []
for row in reader :
# TODO
# 将 'Home Team Goals' 、'Away Team Goals'中的每个元素以整型数据分别添加在相应的列表中
home_team_goals.append(row['Home Team Goals'])
away_team_goals.append(row['Away Team Goals'])
# 打印前10例展示
print(home_team_goals[:10])
print(away_team_goals[:10])
1.2.2、无标题栏的情况
CSV文件存储主要内容,如下截图所示:
可以采用对应列的形式直接读取,获取对应的整列数据。读取文件内容代码,如下:
import pandas as pd
my_csv_path = r'tb.csv'
content = pd.read_csv(my_csv_path, delimiter=',', header=None, index_col=False)
names = content[0].values # 第一列,文件名
pcls = content[1].values # 第二列,类别
scores = content[2].values # 第三列,分数
boxes = content[3].values # 第四列,坐标
for i in range(len(names)):
name = names[i]
pcl = pcls[i]
score = scores[i]
box = boxes[i]
先时获取整列的信息,然后再逐行打印单个内容
二、json 文件操作
2.1、文件读取
简单的举个栗子,json文件内容如下所示:
{
"images": [
{
"height": 2942,
"width": 2369,
"id": 1,
"file_name": "CHNCXR_Normal_000109.png"
},
{
"height": 1024,
"width": 1024,
"id": 2,
"file_name": "MB_NonTB_000581.png"
},
{
"height": 1024,
"width": 1024,
"id": 3,
"file_name": "1.2.345.6.789.3.1.2.855812288.5284.1584690941.264.1.1_2411_2518_0.134494_0.134494.png"
},
]
}
示例的任务就是获取json文件内,所有file_name这个字段的内容,即文件名。代码如下:
import json
def data_transfer(json_path):
bbox_list = []
with open(json_path, 'r') as fp:
print(json_path)
data = json.load(fp) # 加载json文件
for image in data['images']:
print(image["file_name"])
这个比较简单,我就不啰嗦介绍了,建议直接进行操作,再好好学习其中操作的含义。
2.2、文件保存
待更新
三、xml 文件操作
3.1、文件读取
在深度学习领域中经过会用到label标签一个名词,标记的信息类别将以字符的形式保存在xml文件中,这里记录如何读取xml文件,文件内容截图如下:
任务是获取name这个字段,代码如下:
#!/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'):
name = inflection_name.find('name').text
此时,就把记录标注信息name的字符给拿到了。这里是读取,当然修改、重写入也是可以的,后面我们再补,还补在本栏。
3.2、文件保存
import xml.etree.ElementTree as ET
# 创建XML根元素
root = ET.Element('root')
# 创建XML子元素
child1 = ET.SubElement(root, 'child1')
child1.text = 'This is a child element.'
# 创建XML子元素并添加属性
child2 = ET.SubElement(root, 'child2', attrib={'name': 'example'})
child2.text = 'This is another child element.'
# 将XML树写入文件
tree = ET.ElementTree(root)
tree.write('example.xml')
在上面的代码中,我们首先创建了一个XML根元素root,然后创建了两个XML子元素child1和child2,并向它们添加了文本和属性。最后,我们使用ElementTree将XML树写入名为example.xml的文件中。
四、txt 文件操作
4.1、文件读取
这里如题,不做过多的解释,就是把txt文件内容一行一行的读取显示出来,再干点啥自己决定吧
def readTXT():
list_name=[]
for line in open("./list_not_predOK.txt"):
print(line.strip())
打印内容如下:
有人该问啦,为什么不直接采用print(line)形式,这是由于每一行都是存在一个换行符的。当然还有其他的字符,根据自己的需要都可以选择性的去除掉。
这里用到了strip()方法,如下描述:
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
4.2、文件保存
def saveTXT():
data = r'./data'
name_list = os.listdir(data)
save_List = []
np.random.shuffle(name_list)
for file in name_list:
save_List.append('data/'+file)
np.savetxt(r"datasets.txt", np.reshape(save_List, -1), delimiter=',', fmt='%5s')
五、Excel 表格操作
5.1、合并多个Excel表格
日常工作中经常可能会遇到2个表格,或2个以上表格间的数据合并。如果两个表没有相互的联系,那直接合并即可。
但是,如果两个表格有一列是一样的,或者存在包含关系的,那这样随意的合并,就不那么的科学。
这篇文章就是将两个表格中间一样的独立出来,使得其他部分对齐存储,合并成一个新的表格。例如
- 表一包含着病人医院系统存储的信息,分别有如下这么多列的详细信息:'file_name', 'patient_ID', 'study_ID', 'study_date', 'study_time', 'patient_sex', 'patient_age'
- 表二是一个AI机构,帮助这家医院做的自动诊断系统,把病人的疾病区域都分割好了,包含这些信息:'patient_ID','cls', 'scr', 'box', 'loc'
那此时,如果能把这两个表格自动化的合并到一起,那看起来就方便了很多了。下面,我们就是做这样一件事。不卖关子,直接上代码,如下:
import pandas as pd
patientInfo = pd.read_csv(r'dcm_Info.csv')
pdInfo = pd.read_csv(r'pdresults.csv')
df_data = pd.merge(patientInfo, pdInfo, how='outer', on=['file_name'])
print(df_data)
output = df_data[['file_name', 'patient_ID', 'study_ID', 'study_date', 'study_time', 'patient_sex', 'patient_age', 'cls', 'scr', 'box', 'loc']]
output.to_excel(r'combineResults.xlsx')
更多pandas操作,可以看官方链接:pandas - Python Data Analysis Libraryhttps://pandas.pydata.org/
关键函数也就是pandas.merge,下面就是官方注释
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
参数如下:
- left: 拼接的左侧DataFrame对象
- right: 拼接的右侧DataFrame对象
- on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
- left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
- right_on: 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
- left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
- right_index: 与left_index功能相似。
- how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
- sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
- suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
- copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
- indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。
其中关键信息:
- how选择取交集还是并集。由于这里我们是合并,这里就选择outer表示的并集
- on对应的名称要在左右表中都能找到,这样就依据这个共同的列,进行组合
如遇到这个问题,可以参考如下文档,对csv文档进行编码:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte_干货-CSDN博客https://blog.csdn.net/datadev_sh/article/details/83541811https://blog.csdn.net/datadev_sh/article/details/83541811
六、总结
本文,对我们日常工作中常用的一些文件进行了python语言的数据处理,这样无论你是专业写代码的,还是偶尔需要用到数据处理,都非常的快。
最后,如果您觉得本篇文章对你有帮助,欢迎点赞,让更多人看到,这是对我继续写下去的鼓励。如果能再点击下方的红包打赏,给博主来一杯咖啡,那就太好了。