【文件操作】Python文件数据处理之csv、json、xml、txt、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=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/83541811icon-default.png?t=N7T8https://blog.csdn.net/datadev_sh/article/details/83541811

六、总结

本文,对我们日常工作中常用的一些文件进行了python语言的数据处理,这样无论你是专业写代码的,还是偶尔需要用到数据处理,都非常的快。


最后,如果您觉得本篇文章对你有帮助,欢迎点赞,让更多人看到,这是对我继续写下去的鼓励。如果能再点击下方的红包打赏,给博主来一杯咖啡,那就太好了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钱多多先森

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

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

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

打赏作者

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

抵扣说明:

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

余额充值