引言
由于项目中需要处理大量的文件,需要接触不同的文件格式,而不同文件格式的读取方法不尽相同,只有在使用的时候才需要。用到的时候老是上网查太耗时间,翻以前的代码也很耗时间,所以不如写一篇文章记录下目前接触到的处理文件的方法,方便后续忘记怎么处理了再查。
本文会根据项目需求进行不定期更新,因为精力有限难以覆盖所有需求。打算后续有针对性地增加函数的参数解析,和pandas库的使用。
因本人能力有限,如有错误欢迎指出。
注意:目前接触到的文件大多数为纯数字型文件,含有文本的文件接触较少,所以下文不涉及处理文本的内容。
一、txt文件
txt文件是目前接触到的比较频繁的一类文件,一般用来存储索引、评分等。
1、读
''' 1.按行读取 '''
f = open("filename.txt")
while True:
line = f.readline()
if line:
print(line)
else:
break
f.close()
其中f.readline()可以包含参数,如f.readline(num) ,表示每行每次读num个字节,直到行的末尾。
''' 2.多行读取 '''
f = open("filename.txt")
lines = f.readlines()
for line in lines:
print(line)
f.close()
''' 3.一次性读取 '''
f = open("filename.txt")
context = f.read()
print(context)
f.close()
可以通过控制read()的参数,返回指定字节的内容
f = open("filename.txt")
context = f.read(5) # 读取文件前5个字节的内容
print(context)
print(f.tell()) # 返回文件对象当前指针的位置 5
context = f.read(5) # 继续读取5个字节的内容
print(context)
print(f.tell()) # 返回文件对象当前指针的位置 10
f.close()
注意,file对象内部会记录文件指针的位置以便下次操作,只要没有close(),文件指针就不会释放。
2、写
''' 创建文件 '''
f = open("filename.txt","w")
f.write("context")
f.close()
文件打开方式包括r,r+,w,w+,a,a+,b,U,其中r表示只读,w、a表示写入。w删除全部内容,a在文件末尾追加。“+”代表了写入功能。b表示以二进制形式打开,与r,w,a,+一起使用。U支持所有换行符,如"\n"。
注意,对于图片、视频,必须使用二进制模式(b)读写。
''' 使用writelines()把列表中存储的内容写入文件 '''
f = open("filename","w+")
li = ["hello\n","hellooo\n"]
f.writelines(li)
f.close()
二、Excel类文件
1.xlsx文件
(1)读
由于xlrd库会因为版本问题读取xlsx文件时报错,只能读取xls文件,所以这里使用xlrd2库。
import xlrd2
path = "data.xlsx"
wb = xlrd2.open_workbook(filename=path) #用方法打开该文件路径下的文件
ws = wb.sheet_by_name("Sheet1") #打开该表格里的表单
读取后如果想访问具体的值,可以这样操作。
推荐阅读:[python资料] xlrd读取Excel - 知乎
# 访问所有数据
print(ws._cell_values) # list
print(np.array(ws._cell_values)) # ndarray
# 访问行/列
print(ws.nclos, ws.nrows, sep = "\t")
另外也可以使用pandas库读取xlsx文件内容,需要注意读取后的数据结构为dataframe。
注意!!pandas似乎不支持读取xlsx文件了,我的是不可以,可能是版本问题。推荐使用上一种方法。
import pandas as pd
df = pd.read_excel("filename.xlsx", sheet_name='sheet1')
# 转换为ndarray格式
import numpy as np
data = np.array(df)
(2)写
可以使用pandas库把文件保存为xlsx格式。
注意,需要先把数据转换成Dataframe格式。
import pandas as pd
df = pd.DataFrame(data)
df.to_excel("filename.xlsx")
2.csv文件
(1)读
这里指的是把csv的数据读取为ndarray的类型。使用numpy库即可。
import numpy as np
dataArr = np.genfromtxt("data.csv", delimiter=',', skip_header = 1)
注意,这里会跳过第一行(把第一行当作表头而不读取其内容) ,在生成csv文件时需要注意。
这个函数非常好用,其中可以np.genfromtxt(skip_header = 0),这样就不会跳过第一行了。
还有另外一种读取方式,需要用到csv库。
import csv
with open("filename.csv",encoding="utf-8") as f:
file = csv.reader(f)
for row in file:
print(row)
在这个例子中,row的格式为ndarray,并且为按行读取。
注意,第一个元素即row[0][0],不是我们想要的值。
如果想要获得整个csv的数据,考虑将整个数据做堆叠。下面提供一种解决思路。
x = []
with open("filename.csv",encoding="utf-8") as f:
rows = csv.reader(f)
for row in rows:
x = np.r_[x,row] # 得到一个向量
x[0] = 0 # 假设初始值为0
MAP = np.zeros([9,9])
for i in range(MAP.shape[0]):
for j in range(MAP.shape[1]):
MAP[i][j] = x[j+i*9] # 把向量按照一定规律,一个值一个值的赋值给矩阵
这样就得到了csv的左右数据,可以看到还是比较麻烦的。
(2)写
这里的写表示,将数据保存为csv文件。假设要保存一个矩阵为csv格式,可以使用pandas库进行操作。
import pandas as pd
df = pd.DataFrame(data)
df.to_csv('filename.csv',index=False,header=False)
df.to_csv()函数参数如下:
DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True,
index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"',
line_terminator='\n', chunksize=None, tupleize_cols=None, date_format=None, doublequote=True,
escapechar=None, decimal='.')
- path_or_buf : 文件路径,如果没有指定则将会直接返回字符串的 json
- sep : 输出文件的字段分隔符,默认为 “,”
- na_rep : 用于替换空数据的字符串,默认为''
- float_format : 设置浮点数的格式(几位小数点)
- columns : 要写的列
- header : 是否保存列名,默认为 True ,保存
- index : 是否保存索引,默认为 True ,保存
- index_label : 索引的列标签名
三、mat文件
mat文件为Matlab的数据结构,只能用matlab打开,但是如果要读取的话可以使用from scipy.io import loadmat库读取。同样,可以使用savemat保存数据为mat格式。
1.读取.mat文件
from scipy.io import loadmat
path = 'myData.mat'
data = loadmat(path)['data']
loadmat(path)返回的类型不是想要的数据,其类型类似字典,需要引用key才能访问到想要的内容。这里我想要矩阵的数据,故添加['data']引用。最后data的返回值类型为ndarray。
2.保存数据为.mat文件
from scipy.io import savemat
name = "sample"
save_dict = {'name':name,'data':sample}
pth = "data.mat"
savemat(pth, save_dict)