[持续更新中]使用python处理文件

引言

由于项目中需要处理大量的文件,需要接触不同的文件格式,而不同文件格式的读取方法不尽相同,只有在使用的时候才需要。用到的时候老是上网查太耗时间,翻以前的代码也很耗时间,所以不如写一篇文章记录下目前接触到的处理文件的方法,方便后续忘记怎么处理了再查。

本文会根据项目需求进行不定期更新,因为精力有限难以覆盖所有需求。打算后续有针对性地增加函数的参数解析,和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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值