300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Python文件数据处理之csv json xml txt excel等文本文件写入 读取 合并等操作汇总

Python文件数据处理之csv json xml txt excel等文本文件写入 读取 合并等操作汇总

时间:2019-01-04 00:18:58

相关推荐

Python文件数据处理之csv json xml txt excel等文本文件写入 读取 合并等操作汇总

目录

一、CSV 文件操作

1.1、文件写入

1.1.1、pandas库方法

1.1.2、csv库方法

1.2、文件读取

1.2.1、 有标题栏的情况

1.2.2、无标题栏的情况

二、json 文件操作

2.1、文件读取

2.2、文件保存

三、xml 文件操作

3.1、文件读取

3.2、文件保存

四、txt 文件操作

4.1、文件读取

4.2、文件保存

五、Excel 表格操作

5.1、合并多个Excel表格

一、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=Truedataframe.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两列的数据,如下截图所示:

可以通过第一行的列名,逐行来获取单个信息。读取文件内容代码如下:

__author__ = "lingjun"import csvfile = "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 pdmy_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 jsondef 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 osimport xml.etree.ElementTree as ETinflection_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、文件保存

待更新

四、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、文件保存

待更新

五、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'

那此时,如果能把这两个表格自动化的合并到一起,那看起来就方便了很多了。下面,我们就是做这样一件事。不卖关子,直接上代码,如下:

author = 'lingjun'import pandas as pdpatientInfo = 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 Library/

关键函数也就是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博客/datadev_sh/article/details/83541811

后面,我们也将在这个界面,分享和记录更多常见文件的读取和操作技巧,喜欢的欢迎关注、收藏。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。