1.文件的打开与关闭
1.1.文件的打开
在python语言中,可以用open()和file()内置函数打开文件,二者具有相同的功能,可以相互代替。以open()为例:
open()函数打开文件的格式如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None)
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf-8
- errors: 报错级别
- newline: 区分换行符
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
1.2.文件的关闭
python利用close()函数关闭文件,其格式如下:
<文件名>.close()
例如:
f-open('E:\name.txt','r+')
...
f.close()
try:
fh=open('textfile.txt','w')
fh.write('这是测试文件,用于测试异常!')
except IOError:
print("Error:没有找到文件或读取文件失败")
finally:
print("写入成功")
fh.close()
#写入成功
2.文件的读/写
2.1.文件的读取
①read()函数
read()函数可以一次性的将文件中的所有内容全部读取,也可以指定读取多少字节。函数调用格式如下:
<变量>=<文件名>.read([size])
fh=open('战争.txt','r',encoding='utf-8')
f=fh.read()
print(f)
陈冠希)
打 我而家就去打仗
打 属于我自己嘅一场仗
假若现实世界根本就系一个战场
咁一切现象系唔系一堆残酷假象
假如现实叫我去打一场假仗
打住乜嘢旗号 打一场点样嘅仗
打得唔好 我嘅生命就此划上句号
问得唔好 我应该问生命一个乜嘢问号
问我悲哭声可以有几多几多
问我同僚用乜嘢号角吹乜嘢悲歌
歌舞升平嘅世界几可听到凯旋歌曲
曲终人散嘅时候战友剩低几个几个
我问我 我嘅战友系咪就系我一个
我为我嘅生命 战斗要我保卫我
我话我 进一步退一步我都难过
我想过 放弃我唔再识分对错
(胡蓓蔚)
成日顾前顾后 想不透行左转右
是我打呢仗自作自受
(陈奂仁)
............
②readline()函数
readline()函数也可以读取文件的内容,但他的读取方式不同于read()函数,他每次只读取文件中的一行数据,调用格式如下:
<变量>=<文件名>.readline([size])
fh=open('战争.txt','r',encoding='utf-8')
f=fh.readline()
print(f)
#(陈冠希)
# author:answer time:2019/10/20
#文件的读取
f=open("亡命之徒.txt",'r',encoding='utf-8')
fcontent=f.read()
print(fcontent)
f.seek(0) #位置指针移回到文件头
fcon=f.read(9)
print(fcon)
fco=f.readline()
print(fco)
fc=f.readline(4) #readline(size)每次只读取文件中的一行数据,size大与行的字符也只能输出当行全部字符
print(fc)
ff=f.readlines()
for oneline in ff: #readlines()一次性读取当前位置指针指向处后面的所有内容
print(oneline) #并且函数返回的是一个由每行数据组成的一个列表
f.close() #readlines()函数自动将文件内容分析成一个行的列表,该列表由循环处理,使用起来比readline()函数速度快
2.2.文件的写入
①write()函数
write()函数的功能是将字符串写入文件,在使用该函数前,打开文件函数open()不能以‘r’的方式,调用格式如下:
<文件对象>.write(<变量>)
try:
fh=open('textfile.txt','w')
fh.write('这是测试文件,用于测试异常!')
except IOError:
print("Error:没有找到文件或读取文件失败")
finally:
print("写入成功")
fh.close()
#写入成功
②writelines()函数
writelines()函数也可以对文件进行写入操作,其功能是将一个列表的内用写入到文件中,调用格式如下:
<文件对象>.writelines(<列表>)
try:
fh=open('textfile.txt','w')
strlist=[“这是一个测试文件,用于测试文件的写入!”]
fh.write(strlist)
except IOError:
print("Error:没有找到文件或读取文件失败")
finally:
print("写入成功")
fh.close()
#写入成功
3.文件的定位
3.1 seek()函数
使用seek()函数可以改变文件的位置指针,其调用格式如下:
<文件对象>.seek(<偏移量>,<起始点>)
# author:answer time:2019/10/20
#文件的定位 seek()hans
f=open("迷途羔羊.txt","w+",encoding="utf-8")
strlist=['abc','edf','ghi']
f.writelines(strlist)
f.seek(0)
fc1=f.read(1)
print(fc1)
f.seek(0,1)
fc2=f.read(1)
print(fc2)
f.seek(5)
fc3=f.read(1)
print(fc3)
f.seek(0,2)
f.write("xyz")
f.seek(0)
fc=f.read()
print(fc)
f.close()
a
b
f
abcedfghixyz
3.2 tell()函数
tell()函数的功能是获取文件位置指针的当前位置,函数返回值即为当前位置,用相对于文件头的位移量表示。tell()函数调用格式如下:
<文件对象>.tell()
#tell()函数
c=open("亡命之徒.txt","w+",encoding="utf-8")
strlist1=['abc','edf','ghi']
c.writelines(strlist1)
print("当前位置指针:",c.tell())
c.seek(0)
print("当前位置指针:",c.tell())
c1=c.read(1)
print(c1)
c.seek(0,1)
print("当前位置指针:",c.tell())
c2=c.read(1)
print(c2)
c.seek(5)
print("当前位置指针:",c.tell())
当前位置指针: 9
当前位置指针: 0
a
当前位置指针: 1
b
当前位置指针: 5
4.os模块
python内置的os模块直接调用操作系统提供的接口函数,用于对目录和文件进行操作。当导入os模块时使用 import os 。
os模块常用方法:
1、os.remove()删除文件
2、os.rename()重命名文件
3、os.walk()生成目录树下的所有文件名
4、os.chdir()改变目录
5、os.mkdir/makedirs 创建目录/多层目录
6、os.rmdir/removedirs 删除目录/多层目录
7、os.listdir()列出指定目录的文件
8、os.getcwd()取得当前工作目录
9、os.chmod()改变目录权限
10、os.path.basename()去掉目录路径,返回文件名
11、os.path.dirname()去掉文件名,返回目录路径
12、os.path.join()将分离的各部分组合成一个路径名
13、os.path.split()返回(dirname(),basename())元组
14、os.path.splitext()(返回 filename,extension)元组
15、os.path.getatime\ctime\mtime 分别返回最近访问、创建、修改时间
16、os.path.getsize()返回文件大小
17、os.path.exists()是否存在
18、os.path.isabs()是否为绝对路径
19、os.path.isdir()是否为目录
20、os.path.isfile()是否为文件
5. 序列化与反序列化
Python 的 pickle 模块实现了基本的数据序列和反序列化。
- 通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
- 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
pickle模块中最常用的函数为:
pickle.dump(obj, file, [,protocol]) 将obj对象序列化存入已经打开的file中。
- obj:想要序列化的obj对象。
- file:文件名称。
- protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
pickle.load(file) 将file中的对象序列化读出。
import pickle
dataList = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
dataDic = {0: [1, 2, 3, 4],
1: ('a', 'b'),
2: {'c': 'yes', 'd': 'no'}}
# 使用dump()将数据序列化到文件中
fw = open(r'.\dataFile.pkl', 'wb')
# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)
# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()
# 使用load()将数据从文件中序列化读出
fr = open('dataFile.pkl', 'rb')
data1 = pickle.load(fr)
print(data1)
data2 = pickle.load(fr)
print(data2)
fr.close()
# [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
# {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}
参考文本
https://mp.weixin.qq.com/s/ELDaW91e7m_MblN02OXcvQ