当前位置:   article > 正文

Python 读写各类文件_scio.loadmat

scio.loadmat

1. mat

1.1 读取

import scipy.io as scio

mat_data = scio.loadmat('.../xxx.mat')
  • 1
  • 2
  • 3

1.2 写入

'''
data 通常是一个字典(存储对象没有 items 属性会报错)
读取存储的 mat 文件会得到一个字典, key 和 value 与存储时的字典相对应
读取的 value 会自动转为 numpy.ndarray
'''
scio.savemat('.../xxx.mat', data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. json

2.1 读取

import json

json_data = json.load(open('.../xxx.json', 'r', encoding='utf-8'))
  • 1
  • 2
  • 3

2.2 写入

'''
json.dump(obj, 	存储数据对象
		  fp, 	存储目标文件
		  后续参数与 json.dumps() 一致)
'''
with open('.../xxx.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=4, ensure_ascii=False)
f.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
'''
json.dumps(obj, 
		   skipkeys=False, 		字典内key不是python的基本类型(str,unicode,int,long,float,bool,None)会报错, 设为True则跳过这类key
		   ensure_ascii=True, 	是否输出ASCLL码, 设为False可输出中文
		   check_circular=True,	是否跳过对容器类型的循环引用检查
		   allow_nan=True, 
		   cls=None, 			
		   indent=None, 		根据数据格式缩进指定数量空格
		   separators=None, 	指定字典内 每一项 和 key与value之间 的分隔符 separators=(',',':')
		   encoding="utf-8", 	
		   default=None, 		
		   sort_keys=False, 	是否按key排序
		   **kw)
'''
data = json.dumps(data, indent=4, ensure_ascii=False)
with open('.../xxx.json', 'w', encoding='utf-8') as f:
    f.write(data)
f.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3. xml

ElementTree XML API

3.1 xml格式简介

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
<?xml 文档声明 ?>
<根元素名>
    <元素名 属性名="属性值">
        <元素名>文本内容</元素名>
        <元素名 属性名="属性值" 属性名="属性值"/>
    </元素名>
</根元素名>

注:解析时会对xml的换行缩进空格进行处理
<rank>4</rank><rank>
	4
</rank>
是不同的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.2 读取

import xml.etree.ElementTree as ET

'''
XML 是一种分层数据格式, 可以用树结构表示
ElementTree 将整个 XML 文档表示为一棵树, 对整个文档操作(读取/写入)在 ElementTree 上完成
Element 表示该树中的单个节点, 对 XML 的元素操作在 Element 上完成
'''
tree = ET.parse('.../xxx.xml')	# ElementTree 读取整个文档
root = tree.getroot()			# Element     获取根节点(根元素)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
功能返回数据
Element.tag获取当前元素名字符串
Element.attrib获取当前元素所有属性字典
Element.items()获取当前元素所有属性列表
Element.keys()获取当前元素所有属性名列表
Element.get('属性名')获取当前元素指定属性名的属性值字符串
Element.text获取当前元素的文本内容字符串
Element.find('元素名')获取当前元素下第一个该元素名的子元素(一级)Element
Element.findall('元素名')获取当前元素下所有该元素名的子元素(一级)列表
Element.findtext('元素名')获取当前元素下第一个该元素名的子元素(一级)的文本内容字符串
list(Element)获取当前元素下所有的子元素(一级)列表
Element.getiterator('元素名')获取当前元素下所有该元素名的子元素(n级)迭代器
不指定元素名则为所有子元素(n级)
Element.iter('元素名')Element.getiterator()用法相同迭代器
Element.iterfind('元素名')获取当前元素下所有该元素名的子元素(一级)迭代器
'''
Element 可以像列表一样索引
'''
Input: root[0][1].text
Output:'2008'

Input: root[0:2]
Output:[<Element 'country' at 0x0000018AE50B3368>, 
        <Element 'country' at 0x0000018AE50BAA98>]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.3 修改

功能
Element.set('属性名', '属性值')将元素上的属性设为该值,属性不存在则会添加该属性
Element.append(Element)在末尾添加子元素
ET.Element('元素名')新建元素
ET.SubElement(Element, '元素名', attrib={})父元素下创建子元素并返回子元素
ET.ElementTree()新建树
ElementTree._setroot(Element)设置树的根元素

3.4 写入

tree.write('.../xxx.xml')
  • 1

4. txt

4.1 读取

with open('.../xxx.txt', 'r') as f:
	data = f.read()
	data = f.readline()
	data = f.readlines()

'''
三种读取模式
read()			返回字符串, 包含txt中所有内容
readline()		返回字符串, 包含一行的内容, 再运行一次得到下一行内容
readlines()		返回列表, 列表中每个字符串为txt中一行内容
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以用 Numpy 读取,例如对于目标检测的标签文件:

label = np.loadtxt(path, dtype=np.float32).reshape(-1, 5)
  • 1

4.2 写入

with open('.../xxx.txt', 'w') as f:
	f.write(data)

'''
data只能是字符串
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.3 open() 补充

open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
'''
mode:
'r'		读取 		文件不存在报错
'w'		写入		文件不存在新建文件	文件存在覆盖原文件
'x'		创建并写入						文件存在报错
'a'		写入		文件不存在新建文件	文件存在在原文件末尾追加
'r+'	更新(读写)	文件不存在报错		文件存在覆盖原文件
'w+'	更新(读写)	文件不存在新建文件	文件存在覆盖原文件
'a+'	更新(读写)	文件不存在新建文件	文件存在在原文件末尾追加
'rb'	读二进制文件
'wb'	写二进制文件
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5. npz

5.1 读取

import numpy as np

npzFile = np.load('.../xxx.npz')
'''
获取文件中的 array 数据类似字典的键值对索引
通过 npzFile.files 可以由得到文件中存储 array 的 keys 构成的列表
通过 npzFile[key] 得到对应 array
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.2 写入

np.savez('.../xxx.npz', key1 = array1, key2 = array2)
'''
文件路径不写后缀也会自动加上
不设置 keys 会按顺序默认为 arr_0, arr_1, ...
keys 不能重复
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# example
a = np.array([1,2,3])
b = np.array([4,5,6])
np.savez('test1', a = a, b = b)
np.savez('test2.npz', a, b)

npzFile1 = np.load('test1.npz')
npzFile2 = np.load('test2.npz')
print(npzFile1.files)
>>> ['a', 'b']
print(npzFile2.files)
>>> ['arr_0', 'arr_1']
print(npzFile1['a'])
>>> [1 2 3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/596065
推荐阅读
相关标签
  

闽ICP备14008679号