在你编写代码的时候,操作系统为了更快的做出响应,把所有当前的数据都放在内存中,因为内存和cpu数据传输的速度要比在硬盘和cpu之间传输的速度快很多,但不足时一旦机器断点,所有的数据就会丢失,所以此时需要文件存储
文件
打开文件
Python使用open()方法来打开并返回文件对象:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- file: 传入的文件名,如果只有文件名,不带路径的话,那么Python会在当前文件夹中去找到该文件并打开
- mode: 指定文件打开模式
打开模式 | 执行操作 |
---|---|
r | 以只读方式打开文件(默认) |
w | 以写入的方式打开文件 |
x | 如果文件已存在,是用这种方式打开会出现异常 |
a | 以写入模式打开文件,如果文件已存在,则在文件默认追加写入 |
b | 以二进制模式打开文件 |
t | 以文本模式打开 |
+ | 可读写模式 |
U | 通用换行符支持 |
使用open()方法成功打开一个文件之后就得到一个文件对象,拿到这个对象就可以读取或者修改这个文件
open("__init__.py")
操作文件
打开文件并取得文件对象之后,就可以利用文件对象的一些方法对文件进行读取或者修改等操作
文件对象的方法 | 执行操作 |
---|---|
close() | 关闭文件 |
read(size=-1) | 从文件读取size个字符,当未指定size或给定负值的时候, 读取剩余的所有字符串然后作为字符串返回 |
readline | 从文件中读取一整行字符串 |
write(str) | 将字符串str写入文件 |
writelines(seq) | 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象 |
seek(offset,from) | 在文件中移动文件指针,从from (0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节 |
tell() | 返回当前在文件中的位置 |
文件的操作不做细分处理,有上面的api足够使用,遇到问题请自行查找官方api接口使用手册
关闭文件
close()方法用于关闭文件。
Python拥有垃圾回收机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以在python变成里,如果忘记关闭文件并不会造成内存泄漏,但还是尽量在完成写入之后关闭文件
文件系统
Python对于文件系统的访问,是通过OS(Operate System-操作系统)来实现的。目前市面上的操作系统主要有Windows、Mac OS、Unix、Linux等。
这些系统对于文件系统的访问原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块,这就导致程序运行环境发生变化,就要去修改大量的代码去解决。所以Python提供OS模块来解决这种情景,开发者可以不需要关心什么
操作系统下使用什么模块,OS会帮助我们选择合适的模块
函数名称 | 使用方法 |
---|---|
getcwd() | 返回当前工作目录 |
chdir(path) | 改变工作目录 |
listdir(path=’.’) | 列举制定目录中的文件名(‘.’:表示当前目录,’..’:表示上一级目录) |
mkdir(path) | 创建单层目录,如果目录已存在则抛出异常 |
mkdirs(path) | 递归创建多层目录,如果该目录已存在则抛出异常 |
remove(path) | 删除文件 |
rmdir(path) | 删除单层目录,如果该目录非空,则抛出异常 |
removedirs(path) | 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常 |
rename(old,new) | 将文件old重命名未new |
system(command) | 运行系统的shell命令 |
os.curdir | 当前目录(”.”) |
os.pardir | 上一级目录 |
os.sep | 输出操作系统指定的路径分隔符(windows为’\’,Linux为’/’) |
os.linesep | 当前系统使用的行终止符(Window下为’\r\n’,Linux下为’\n’) |
os.name | 当前使用的操作系统(posix、nt、mac等等) |
不多做介绍,重点介绍几个特别的方法
system
几乎每个操作系统都会提供一些小工具,system()函数用于使用这些小工具
import os
os.system('calc') # 获取系统自带的计算器
walk(top)
walk是一个很有用的函数,它的作用是遍历top参数指定目录下的所有子目录,并将结果返回一个三元组(路径,[包含目录],[包含文件])
import os
# 输出当前文件所在路径的上一级目录所包含的文件夹和文件
def os_walk():
for i in os.walk(os.pardir) :
print(i)
os_walk()
os.path模块
另一个强大的模块是os.path模块,它可以完成一些针对路径名的操作。
函数名 | 使用方法 |
---|---|
basename(path) | 去掉目录路径,单独返回文件名 |
dirname | 去掉文件名,单独返回目录路径 |
join(path[,path2[,path3]]) | 将path、path2、path3各部分组合成一个路径名 |
split(path) | 分割文件名与路径,返回(f_path,f_name)元组 |
splitext(path) | 分离文件名与扩展名,返回(f_name,f_extension)元组 |
getsize(file) | 返回指定文件的尺寸,单位是字节 |
getatime(file) | 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或者localtime()函数换算) |
getctime(file) | 返回指定文件的创建时间 |
getmtime(file) | 返回指定文件最新的修改时间 |
exists(path) | 判断指定路径或文件是否存在 |
isabs(path) | 判断指定路径是否为绝对路径 |
isdir(path) | 判断指定路径是否是文件夹 |
isfile(path) | 判断指定路径是否是文件 |
islink(path) | 判断指定路径是否存在是一个符号链接 |
ismount(path) | 判断指定路径是否存在且是否是一个挂载点 |
samefile(path1,path2) | 判断path1和path2两个路径是否指向同一个文件 |
pickle
之前的文件保存一直操作的是字符串,读写很简单。但是当我们操作更复杂一点的数据对象:列表,字典,类的实例等时普通的文本操作就会变得不知所措。
如果将其转化成字符串再保存进文件,可当读取的时候也是字符串,不是list,字典或者类的实例,因此,Python提供了一个标准模块,使用这个模块就可以很容易的把这些
列表,字典等复杂数据类型写进文件。这个模块就是pickle(泡菜)
import pickle
import os
## 写入my_list.pkl文件
def test_pickle():
list01 = [1, 2, 'test', '我爱你']
pickle_file = open(os.curdir + "my_list.pkl", "wb")
pickle.dump(list01, pickle_file)
pickle_file.close()
test_pickle()
执行完之后会在当前路径生成my_list.pkl文件
import pickle
import os
## 读取
def test_pickle02():
pickle_file = open(os.curdir + "my_list.pkl", "rb")
my_list = pickle.load(pickle_file)
print(my_list)
test_pickle02()
## 输出是
[1, 2, 'test', '我爱你']
执行完之后会在当前路径生成my_list.pkl文件