python中常用的文件读写方法(txt文本文件,excel文件,CVS文件,mat文件)
目录
一、txt类文本文件的读写
使用python处理数据文件较多,而且大部分数据文件保存在文本文件中(例如:‘ .txt ’, ‘ .json ‘ 文件)
读取文本文件的主要步骤分为:a)打开目标文件; b)获取文件内数据; c)关闭文件
打开文件的一般方式为:
f=open(file_name,access_mode = 'r',buffering = -1)
其中 filen_ame即为目标文件名,输入为字符串形式;access_mode = ‘r’ 表示执行功能 。‘r’ 表示读取(read);‘w’ 表示写入(write); ‘a’表示增加(add),也是写入的一种,直接在已存在文本数据后面新增数据 ;buffering = -1指定缓存方式,-1表示模型缓存,0表示不缓存,1表示缓存一行,n表示缓存n行(没有特殊性能要求,该参数不做修改,直接默认即可)
由于文本文件内容编码方式千变万化,很多时候直接用open()读写会出现编码错误的问题,例如:
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-11: ordinal not in range(128)
python代码里稍不注意就会出现这样的错误,特别是在Linux环境下,如果python代码里面出现中文或者异常符号,运行代码时候就会出现这样的错误。此时可以在代码的起始位置增加:# code = ‘utf-8’ 或者 # coding = UTF-8,最佳的处理方式是引入sys模块。
import sys
reload(sys)
sys.setdefaultencoding('utf-8') # utf-8可以根据需哟更换成其他编码方式
而基于文本文件读写遇到这样的错误,则推荐用python的另外一个模块codecs.
fw = codecs.open('test1.txt','a','utf-8')
或者使用with来实现代码:
with codecs.open('文件名','a',encoding = 'utf-8') as file:
codecs模块可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数 是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述 操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。
一下是几种常见的文本文件读取数据代码:
## 读取文件数据的三种方法
# 方法一 : read(),直接将整个文本内的数据读取到一个字符串中。读取整个文本时候可以,但是读取多行多列数据的时候不推荐。
with codecs.open('test.txt','r',encoding = 'utf-8') as file: # 打开文件
data = file.read() # 读取数据,data为整个文本文件里面的内容,为字符串形式。
file.close() # 关闭文件
# 方法二 : readline(),一行一行的读取,这种操作在以行为单位的数据读取时候比较方便,适合较大数据文件
with codecs.open('test.txt','r',encoding = 'utf-8') as file: # 打开文件
while True:
data_i = file.readline() # 读取第i行的数据,fata_i即为第i行数据,是字符串形式,可以进行数据处理
file.close() # 关闭文件
# 方法三 : readlines(),直接读取整个文本文件数据形成一个list,每一行数据对应list中的一个元素(字符串形式)
with codecs.open('test.txt','r',encoding = 'utf-8') as file: # 打开文件
data = file.readlines() # data 为一个list,每个元素是一行的数据
for data_i in data:
data_i.rstrip('\n') # data_i为第i行数据是一个字符串,但是结尾后换行符'\n',需要去掉。
file.close() # 关闭文件
文本文件的写入有两种情况,分为一次性写入与逐行写入。
# 写入的方式有两种,一种是一次性写入,一种是逐行写入,在后面增加新内容
# 方法一 : 一次性写入'w'
with codecs.open('test.txt','w',encoding = 'utf-8') as file:
file.write('数据内容或者变量')
file.close()
# 方法二 :逐行写入,增加新内容,适用于循环条件下
with codecs.open('test.txt','a',encoding = 'utf-8') as file:
for i in range(10):
file.write('每次循环的数据')
file.close()
Json文件是一种特殊的文本文件,写入方法并不是write,而是json.dump()
with codecs.open('test.json','a',encoding = 'utf-8') as file:
# 假设变量为一个list
list = [1,2,3,4,5]
json.dump(list,file,ensure_ascii = False,indent = 2)
# ensure_ascii = False 指定输出为中文,否则输出为编码
# indent = 2 是指定每个字之间的间距
二、 excel文件的读写
ID | Name | age | scors |
101 | Tom | 12 | 9 |
102 | Lucy | 14 | |
103 | Tomas | 7 | |
104 | Anna | 16 | |
105 | Andy | ||
106 | Jack | 12 | 5 |
107 | Dave | 6 | |
201 | Hiton | 10 | 7 |
206 | Ben | 15 | 10 |
203 | Joy | 14 |
如表格test.xlsx所示,我需要读取表格内部数据信息,但我特意部分信息缺失。列表操作有很多,例如:
a)获取excel文件中所有表格
b)根据表格获取对应表格内的数据信息
c)获取表格的行数,列数
d)整行或者整列的切片处理
e)获取指定位置的数据内容
import xlrd
# 打开文件
workbook = xlrd.open_workbook(r'./test.xlsx')
# a)获取excel文件中所有表格
sheet = workbook.sheet_names()
print(sheet) # 输出为['class_one'],是一个list类型,每一个元素对应一个表名
# b)根据表格索引或者名称获取对应表格内的数据信息
# 根据索表名引号获取表格
data1 = workbook.sheet_by_index(0)
# 根据表名获取表格
data2 = workbook.sheet_by_name(sheet[0])
# c)获取表格的行数,列数
# 表格的行数
num_row = data1.nrows
print(num_row) # 输出为11,该方式读取将列名一起读入,如果要对数据进行处理,第一行数据需要去除
# 表格的列数
num_col = data2.ncols
print(num_col) # 输出为4
# d)整行或者整列的切片处理
data_row = data1.row_values(0)
print(data_row) # 输出['ID','Name','age','scors']为一个list类型,每个元素为一个字符串
data_col = data2.col_values(0)
print(data_col) # 输出['ID','101','102','103','104','105','106','107','201','206','203']
# e)获取指定位置的数据内容
print(data1.cell(2,1)) # 输出第三行第二列的数据信息 text:'Lucy'
print(data2.cell(2,1).value) # 输出第三行第二列的数据内容 Lucy
对excel文件的写入操作:
#!/usr/bin/env python
# coding=utf-8
from xlwt import *
#需要xlwt库的支持
#import xlwt
file = Workbook(encoding = 'utf-8')
#指定file以utf-8的格式打开
table = file.add_sheet('data')
#指定打开的文件名
data = {
"1":["张三",150,120,100],
"2":["李四",90,99,95],
"3":["王五",60,66,68]
}
#字典数据
ldata = []
num = [a for a in data]
#for循环指定取出key值存入num中
num.sort()
#字典数据取出后无需,需要先排序
for x in num:
#for循环将data字典中的键和值分批的保存在ldata中
t = [int(x)]
for a in data[x]:
t.append(a)
ldata.append(t)
for i,p in enumerate(ldata):
#将数据写入文件,i是enumerate()函数返回的序号数
for j,q in enumerate(p):
# print i,j,q
table.write(i,j,q)
file.save('data.xlsx')
三、 CVS文件读写
cvs文件也是常用的数据文件形式之一,读取一般有两种,python自带的cvs模块,以及pandas里面的读取工具。在这里介绍一下python自带模块,pandas工具相当强大,后面统一整理。
CVS读取代码:
import cvs
cvs_file = open('test.cvs','r')
file = cvs.reader(cvs_file) # 获得一个List,每一个元素为一行
for line in file:
print(line)
CVS写入代码:
out = open('test.csv','a', newline='') # newline =''是为了避免出现空行问题
csv_write = csv.writer(out,dialect='excel') # 指定文件类型为excel类型
csv_write.writerow('写入内容')
四、 mat文件的读写
import scipy.io
data = scipy.io.loadmat('matData.mat') # 读取mat文件
print(data.keys()) # 查看mat文件中的所有变量,因为同一个mat文件中可能有多个变量的内容
print(data['matrix1'])
print(data['matrix2'])
matrix1 = data['matrix1']
matrix2 = data['matrix2']
print(matrix1)
print(matrix2)
scipy.io.savemat('matData2.mat',{'matrix1':matrix1, 'matrix2':matrix2}) # 写入mat文件
# matData2.mat为生成的文件名,{ }内的内容为键值对——变量名:变量
转载自:https://blog.csdn.net/zc20161202005/article/details/81666701