python读写操作(txt, mat, xls, etc文件)
这里简单总结python中对数据文件的简单读写操作。
txt文件
在numpy库中有很好的对txt文本文件进行操作的函数 [1],如下例:
读取txt文件
import numpy
array = numpy.loadtxt('data_array.txt')
如果data_array.txt是按照矩阵存放的文本文件,那么读出来的array就是和原文件结构一致的矩阵。
写入txt文件
同样可以使用numpy库中的函数将矩阵变量保存为文本文件 [2]。
numpy.savetxt('array2D.txt', array_2D)
npy格式高维矩阵的读写
使用txt文本文件只能保存1或2维的矩阵,对于高于2维的矩阵可以使用.npy后缀的文件进行读写和保存 [3]。
# save 3D/4D matrix to .npy files
numpy.save('M3D.npy', M3D)
numpy.save('M4D.npy', M4D)
# load 3D/4D matrix from .npy file
M3D_data = numpy.load('M3D.npy')
M4D_data = numpy.load('M4D.npy')
xls电子表格的读写
xls格式的电子表格是Office系列办公软件常用的工作文件格式,可以在电子表格中灵活的储存丰富的有用数据。利用python可以配合office软件对其中的数据进行批量的自动操作,极大的提高数据分析的效率,节省宝贵的时间。
读取xls电子表格
读取xls电子表格内容的一种方式是调用xlrd库 [4]。
user | age |
---|---|
Tom | 20 |
Jack | 22 |
Lily | 18 |
Jim | 25 |
Lucy | 21 |
... | ... |
假设你的电子表格内容如上表,那么读取代码可以是这样:
import xlrd # module to read .xlx files
sheet_book = xlrd.open_workbook('sheetbook.xls')
sheet1 = sheet_book.sheet_by_name('sheet1')
n_row = 24
user_names = []
user_ages = numpy.zeros(n_row)
for i in range(0, n_row):
# read user names
user_names.append(sheet1.cell(i+1, 0).value)
user_ages[i] = sheet1.cell(i+1, 1).value
将n_row设为24就可以读取24行数据,也即24个人的姓名和年龄,并保存为python中的可以储存姓名的字符list和年龄的数组向量。
写入xls电子表格
如果直接读取xls表格是无法直接对其进行写入操作的,因为用xlrd读取的表格对象不包含保存为xls的函数。或许是为了防止覆盖原有数据,python中似乎无法对原表格中的数据进行替换和填充。如果要写入xls电子表格,有两种方式,一种是从零开始新建一个表格 [5],另一种方式是复制原表格的内容,进行修改后再保存为新的版本 [6]。
新建表格并保存
完全新建表格的示例代码如下:
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('test')
for i in range(len(x_array)):
sheet.write(0, i, x_array[i])
workbook.save('testput.xls')
复制原表格并修改保存副本
在这个操作是原装的python可能会缺少响应的库,需要我们用pip进行手动安装 [6]。如果是linux/macOS的系统,打开终端键入下面命令即可,如果是windows电脑系统,应该可以使用powershell来安装吧?
pip install xlutils
下面的代码即示例对原表格复制后修改保存新副本的过程。
# pip install xlutils
y_array = numpy.linspace(1, 3, 100)
from xlutils.copy import copy
work_book = xlrd.open_workbook('testput.xls')
# new_book = xlwt.add_sheet('newbook')
new_book = copy(work_book)
new_sheet = new_book.get_sheet('test')
for i in range(len(y_array)):
new_sheet.write(i, 0, y_array[i])
new_book.save('new_testput.xls')
mat数据的读取
.mat后缀的数据文件是matlab中保存复杂数据的一种格式,一般对于复杂的结构体数据多用这种格式进行储存。但是由于matlab昂贵的价格,一般商用中多使用python进行替代,国内外很多科研机构也逐渐用python对matlab进行替代,一般在经济能力有限的学生群体中比较流行用python替代matlab进行编程。有时迫不得已要用python对已有的.mat进行数据读取的操作,但是鉴于.mat格式保存数据的灵活性和复杂性,即便是下面的简单读取方法介绍仍然有可能不适用你手头的.mat数据。建议尽量用matlab打开和读取.mat数据,如果确实要在matlab和python之间交换数据,建议保存为.txt文本文件或者.xls或.csv格式的电子表格。简单的例子如下 [7]:
import scipy.io
mat_dic = scipy.io.loadmat('file.mat')
# after this step, the mat_dic is a dictionary format file in pylab
# to convert it to a ndarray, you need to get its value out
mat_data = mat_dic['element1']
上面展示的是用python读取一个保存为.mat格式的结构体,并将其中一个元素保存为数组变量。
参考
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html
[3] https://stackoverflow.com/questions/33697615/how-do-i-save-a-3d-python-numpy-array-as-a-text-file
[4] https://stackoverflow.com/questions/2942889/reading-parsing-excel-xls-files-with-python
[5] https://www.geeksforgeeks.org/writing-excel-sheet-using-python/
[6] https://stackoverflow.com/questions/2725852/writing-to-existing-workbook-using-xlwt
[7] http://scipy-cookbook.readthedocs.io/items/Reading_mat_files.html