@[toc](Python模块(10)-文件 open .cvs .json .mat)
open 不仅能打开txt文件,还能打开.csv,.JSON 文件
1. 文件
计算机的文件就是保存在 长期存储设备 上的一段数据,长期存储设备包括:硬盘 U盘 移动硬盘 光盘.
文件的作用:将数据长期保存下来,在需要的时候使用.
cpu 要使用 存在硬盘中文件,需要先将文件加载到内存.
常见两种类型的文件 : 文本文件 和 二进制文件
文本文件 : 可以只用文本编辑软件查看的 ,如Python源程序 , 本质上还是二进制文件
二进制文件 : 保存的内容不是给人直接看的,而是提供给其他软件使用的.例如: 图片文件 音频文件 视屏文件,等不能直接用文本编辑器查看,要有相应的应用软件.
2. 文件的基本操作
在计算机中操作文件的固定套路:
1.打开文件
2.读写文件:读-将文件内容加载到内存.写-将内存内容写到文件
3.关闭文件
在Python中 常用的操作文件的1个函数,3个方法.
| 名称 | 类型 | 说明 |
|---|---|---|
| f.open() | 函数 | 打开文件,并返回文件操作对象(文件句柄) |
| f.read() | 方法 | 将文件内容读到内存 |
| f.write() | 方法 | 将内存内容写入文件 |
| f.close() | 方法 | 关闭文件,不关闭会占用系统可打开文件句柄数 |
| open函数打开文件,并返回文件操作对象,后面的三个方法通过 文件对象 来调用. |
文件句柄的其他方法
| 方法 | 说明 |
|---|---|
| f.flush() | 刷新输出缓存 |
| f.read([count]) | 指定读出count个字节的文件内容 |
| f.readline() | 读出一行信息 |
| f.readlines() | 读出所有行信息 |
| f.seek(offset[,where]) | 从where开始移动文件指针offset个单位,where=0文件开始处,1当前位置,2文件结尾 |
| f.tell() | 获得文件指针的位置 |
| f.writelines(list) | 把list中的字符串一行一行写入文件,连续写入文件,没有换行 |
3. 读取文件open()
open函数 的第一个参数是 要打开的文件名(要带扩展名). 如果文件存在,返回文件操作对象,如果文件不存在,会抛出异常.
read方法可以一次性 读入并返回文件的所有内容。如果忘记关闭文件,会造成资源浪费,和后续操作困难所以打开之后,应该写关闭语句,然后再去写读写操作语句
【初级】
# 1.打开文件
file=open("test.txt")
# 2.读取文件内容
text=file.read()
print(text)
# 3.关闭文件,如果忘记关闭文件,会造成资源浪费,和后续操作困难所以打开之后,应该写关闭语句,然后再去写读写操作语句
file.close()
【中级】由于文件读写时都有可能产生IOError,一旦出错file.close()就不会调用。为了保证无论是否出错都能正确地关闭文件,可以使用try … finally来实现:
try:
fr = open("test.txt","r")
contents = fr.read()
print(contents)
finally:
if fr:
fr.close()
"""
没有这个文件一样会提示
Traceback (most recent call last):
File "test.py", line 41, in <module>
if fr:
NameError: name 'fr' is not defined
"""
【终极】with语句能够确保最后文件一定被关闭,且不用手动再调用close方法,效果和前面的try … finally是一样。
with open("test.txt","r") as fr:
contents=fr.read()
print(contents)
"""
没有这个文件会抛出IOEror
Traceback (most recent call last):
File "test.py", line 32, in <module>
with open("test.txt") as fr:
IOError: [Errno 2] No such file or directory: 'test.txt'
TODO: 仅能保证存在文件且中途读写出错时文件正常关闭?
"""
3.1 文件指针: 标记从哪一个位置开始读取数据.
第一次打开文件时,文件直至会指向 文件的开始位置.
执行read方法后,文件指针会指向 读取内容的末尾
注意:如果执行了一次read方法,读取了所有内容,再次调用 read方法时,不能够读取文件内容了. 因为第一次读取后,文件指针移动到了文件末尾.
# 1.打开文件
file=open("test.txt")
# 2.读取文件内容
text=file.read()
print(text)
print(len(text))
print("-"*50)
text=file.read()
print(text)
print(len(text))
# 3.关闭文件,如果忘记关闭文件,会造成资源浪费,和后续操作困难所以打开之后,应该写关闭语句,然后再去写读写操作语句
file.close()
输出:
hello python
hallo
19
--------------------------------------------------
0
实际上并没有说如何解决这个问题,或者进一步操作
3.2 文件的打开方式mode
file=open(“文件名.扩展名”,“打开方式”)
打开文件的方式:open 函数需要传递的第二个参数.如果不指定打开方式,默认以只读方式 打开,并返回文件对象
| 打开方式 | 说明 |
|---|---|
| r | 以只读方式打开,文件指针在文件头 |
| w | 以只写方式打开,如果文件存在会覆盖, 如果文件不存在创建新的文件 |
| a(append) | 以追加方式打开,文件指针在文件尾. 如果文件不存在创建新的文件 |
| r+ | 以读写方式打开,文件指针在文件头 |
| w+ | 以读写方式打开,如果文件存在会覆盖, 如果文件不存在创建新的文件 |
| a+ | 以读写方式打开,文件指针在文件尾. 如果文件不存在创建新的文件 |
| 读写方式打开,频繁操作文件指针,会影响文件读写效率.开发时,更多会以只读 或者只写 的方式来操作文件. |
3.3 文件按行读取
3.3.1 readline()
read 方法会把文件的所有内容都读入到内存,如果文件太大,会使得内存占用率非常高.可以改用逐行读取的方法.readline()方法可以一次读取一行内容,方法执行后会把文件指针移动到下一行.
代码示例:
file=open("test.txt")
while True:
text=file.readline()
print(text)
# 判断是否读到内容
if not text:
break
file.close()
3.3.2 readlines()
data = []
data1 = []
fr = open("readline_test.txt")
for line in fr.readlines(): # 也是全部读取,吃内存
line = line.strip() # 去掉字符串开头或者结尾的空白符,包括换行符
data_line = line.split(",") # 使用","分割数据并返回一个列表
data_line1 = list(map(int, line.split(",")))
data.append(data_line)
data1.append(data_line1)
print(data)
print(data1)
fr.close()
read(size)当size不指定时,会将文件全部内容读取
readline()一次只读取一行即遇到‘\n’返回
readlines()读取整个文件,并返回列表,一行为一个元素
4.文件输出f.write(),print()
f = open("outpu.txt", "w") # 没有文件的话会新建一个
data = [['1', '2'], ['3', '4']]
line1 = ','.join(data[0])
f.write(line1 + '\n')
line2 = ','.join(data[1])
f.write(line2 + '\n')
# print 把原本输出到shell 的内容改输到文件中
data = [[1, 2], [3, 4]]
for line in data:
print(str(line[0]) + ',' + str(line[1]), file=f)
output.txt文件的内容
1,2
3,4
1,2
3,4
5.文件复制
5.1 小文件复制(搬家)
打开两个文件-读取原文件内容-写入目标文件-关闭两个文件。
打开文件:原文件默认以只读的方式打开,目标文件以只写"w"的方式打开,如果没有目标文件,会新建一个目标文件。
代码实例:
# 1.打开文件
file_read=open("readme.txt")
file_write=open("readme_copy.txt","w")
# 2.读取操作
text=file_read.read()
file_write.write(text)
# 3.关闭
file_read.close()
file_write.close()
5.2 大文件复制(搬家)
一次性读取会给内存造成巨大的压力,可以使用按行读取与写入来实现这个功能。
# 1.打开文件
file_read=open("readme.txt")
file_write=open("readme_copy.txt","a")
# 2.读取操作,按行操作
while True:
text=file_read.readline()
if not text:
break
file_write.write(text)
# 从头开始写是文件指针的问题,设定在本页的结尾打开,如一追加的方式加原文件的内容到新文件。
# 3.关闭
file_read.close()
file_write.close()
5.3 shutil.copy()
import shutil
shutil.copy(文件1,文件2)
对文件1的内容和权限都进行copy。
5.4 shutil.rmtree()
删除一个文件夹(如果文件夹里面有文件也会一起被删掉)比较6.3中的删除。
shutil.rmtree(’./cyy_test/subtest2’)
6 .csv文件
excel 格式的数据,将文件存成csv。以逗号作为文件分割符号。
f=open(‘data.csv’)
import pandas
data = pandas.read_csv()
7.json文件
json 模块提供了一种很简单的方式来编码和解码JSON数据。 其中四个主要的函数是 json.dump(), json.dumps()与json.load(), json.loads()。
保存字典格式的数据,将文件存成JSON 的格式,借助json模块实现序列化和反序列化
序列化:字典格式 -> 字符串 json.jumps()
反序列化:字符串 -> 字典格式 json.loads()
import json
x = {
"height": 176,
"weight": 60
}
y = json.dumps(x) # 转化为字符串
xx = json.loads(y)
print("原x", x)
print("序列化x", y)
print("反序列化x", xx)
f = open("json_test.json", 'w')
json.dump(x, f) # 不带s的 json.jump()保存json文件,json.load()导入json文件
f.close()
f = open("json_test.json", 'r')
print("从文件读取到的json", json.load(f))
# print 输出
原x {'height': 176, 'weight': 60}
序列化x {"height": 176, "weight": 60} # 三者的区别并不大
反序列化x {'height': 176, 'weight': 60}
从文件读取到的json {'height': 176, 'weight': 60}
典型应用deno: 字典数据的存储和读取
# 文件载入
processed_data_dict_json_file = "xx.json"
with open(processed_data_dict_json_file, "r") as f:
processed_data_dict = json.load(f)
# 文件写入
out_processed_data_dict_json_file = "xxxx.json"
with open(processed_data_dict_json_file, "w") as f:
json.dump(processed_data_dict, f)
参考博文:json.dump(), json.dumps()与json.load(), json.loads()区别
(参考博文里说的, json.dumps() json.loads()的作用没有get到)
8 .mat文件
.mat 是matlab中数据存储的标准格式,Python中能够通过库scipy读取和保存。
from scipy import io # 导入scipy库
io.loadmat(file_name, mdict=None, appendmat=True, **kwargs) # 1.读取
io.loadmat(file_name) # 1.读取-省略默认参数
# append mat–true(默认值),将.mat扩展名附加到给定文件名的末尾(如果尚未存在)。
scipy.io.savemat(file_name, mdict, appendmat=True, format='5', long_field_names=False, do_compression=False, oned_as='row') # 2.写入
io.savemat('文件目录(到文件名,无需扩展名)', {'Descriptors': ny.arrry}) # 2.写入-身略默认参数
# 写入的数据放在 字典值的位置,而字典的键在matlab 读取数据时有用。
savemat详细文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.savemat.html
9. 文本文件的编码方式
文本文件存储的内容是基于字符编码的文件,常见的编码有ASCII和UNICODE编码。
Python2.x默认使用ASCII 编码
Python3.x 默认使用UTF-8编码
Ascii编码:计算机中只有25个ASCII 字符,一个ASCII在内存中占一个字节(8位,256种组合方式)
UTF-8编码:使用1-6个字节来表示一个字符,涵盖了地球上几乎所有地区的文字。大多数汉字会使用三个字节表示。UTF-8 是UNICODE编码的一种编码格式。
10. 在Python2.x中使用中文
希望Python2.x 解释器以UTF-8的方式解析文件,需要在Python2.x的开头使用一下代码,解释器会以UTF-8编码来处理Python文件.
官方推荐:
# *-* coding=utf-8 *-*
也可以写:
# coding:utf8
在Python2.x中,带有中文与英文混合的字符串需要在字符串的开头写一个u,来告诉编译器这是一个utf8编码的字符串.
a=u"hello 世界"

7312

被折叠的 条评论
为什么被折叠?



