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文件的读写 

test.xlsx
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

You may also like...