Python 读写各类文件

1. mat

1.1 读取

import scipy.io as scio

mat_data = scio.loadmat('.../xxx.mat')

1.2 写入

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

2. json

2.1 读取

import json

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

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()
'''
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()

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>
<?xml 文档声明 ?>
<根元素名>
    <元素名 属性名="属性值">
        <元素名>文本内容</元素名>
        <元素名 属性名="属性值" 属性名="属性值"/>
    </元素名>
</根元素名>

注:解析时会对xml的换行缩进空格进行处理
<rank>4</rank><rank>
	4
</rank>
是不同的

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     获取根节点(根元素)
功能 返回数据
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>]

3.3 修改

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

3.4 写入

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

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中一行内容
'''

4.2 写入

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

'''
data只能是字符串
'''

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'	写二进制文件
'''

5. npz

5.1 读取

import numpy as np

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

5.2 写入

np.savez('.../xxx.npz', key1 = array1, key2 = array2)
'''
文件路径不写后缀也会自动加上
不设置 keys 会按顺序默认为 arr_0, arr_1, ...
keys 不能重复
'''
# 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]

猜你喜欢

转载自blog.csdn.net/weixin_43605641/article/details/118392183
今日推荐