目录html
在上篇文章 中,全面讲解了 python 3 中 的面向对象,今天我会继续探险,去掌握 python 3 中的文件操做, let's go 让咱们出发吧!python
一谈到文件,就会涉及到一个的重要的概念,持久化 。什么是持久化?json
持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(好比内存中的数据,是不能永久保存的)持久化为持久数据。 ——来源于百度百科缓存
因而可知,持久化数据就是在程序运行结束后或者断电后再开机,还继续存在的数据。而文件就是最典型的表现形式。那什么是文件呢?函数
文件就是存储在如硬盘,光盘这样的非易失媒介上的信息序列。像内存,在关机或掉电后,信息就所有丢失了,文件固然不会存储在它上面。学习
当咱们想要读或者写文件时,就得先打开(open) 文件才能够,而当读写完成的时候,也要尽可能将其关闭(close),这样才可以释放它占用的系统资源啊。操作系统
使用内置函数 open
就能够打开文件。先来看下 python 中对 open
函数的定义3d
file object = open(file_name [, access_mode][, buffering])
参数定义以下code
access_mode
表示文件模式。常见的模式有读模式,写模式,追加模式等。这个参数是可选的,若是不填,默认就是读模式。具体的文件模式列表在下面表格中列出。buffering
缓存标志
file_name
表示要访问的文件路径名称,能够是相对路径,也能够是绝对路径。具体的文件模式 access_mode
参数表以下xml
值 | 功能描述 |
---|---|
w | 写模式 |
r | 读模式 |
x | 写模式,建立一个文件,若是文件已存在,则报错 |
a | 追加模式 |
b | 二进制模式(可与其余模式结合使用) |
+ |
读/写模式(可与其余模式结合使用) |
其中 b
或者 +
可与其余模式结合使用须要说明下:
rb
就表示读取一个二进制文件w+
表示对打开的文件可读可写wb+
则表示对二进制文件可读可写,若是模式中不加 b
则默认表示文本文件调用 open
函数后返回的是什么对象呢?可以从这个对象中获取什么信息和执行什么操做呢?来看下一节
调用 open
函数后返回的是一个文件句柄,这个句柄中包含许多文件相关的属性,具体以下面表格所示
属性 | 功能描述 |
---|---|
file.closed |
文件是否已关闭,是则返回 true |
file.mode |
打开文件时使用的模式 |
file.name |
文件名称 |
来看一个例子
f = open('test.py', 'r+') # 文件名称. print ("File name: ", f.name) # test.py # 文件是否已关闭 print ("File state: ", f.closed) # False # 文件打开时的模式 print ("Opening mode: ", f.mode) # r+
打开文件后,最多见的操做就是读文件和写文件了,先来看读文件
在读取文件时, 最经常使用的方法就是 read()
,readlines()
两个方法,在操做结束后都要调用 close()
方法关闭文件,释放资源。
先来看 read()
方法
打开文件后,
调用 read(size)
方法能够一次读取 size
字节的数据
若是read()
方法中没有参数能够一次将文件内容所有读入到内存中
来看一个例子,假设有一个文件名称为 a.txt
内容为
Good morning, everyone! Good morning, my student!
先来读取前 4 个字母
try: f = open('a.txt', 'r') print(f.read(4)) # Good finally: if f: f.close()
上面代码为何要用 try ... finally
包裹呢?
这是由于文件操做极可能出现 IO 异常的状况,须要使用 try ... finally
包住,即便出现异常也能保证 close()
方法可以正常调用。
其实还有更简洁的写法,就是使用 with
语句,它就是一个语法糖,一下就把 try ... finally
的活都干了。来感觉下它的威力
with open('a.txt', 'r') as f: print(f.read(4)) # Good
对于文本文件来讲,若是比较大,使用 readline()
方法则更为合理,能够一次读取一行内容。
with open('a.txt', 'r') as f: print(f.readline()) # Good morning teacher!
若是一次想返回多列文本,可使用 readlines()
方法,它会返回一个列表。
with open('a.txt', 'r') as f: print(f.readlines()) # ['Good morning teacher!\n', 'Good morning, my student!']
写文件和读文件操做很是相似,它们的区别就在于:
open
方法打开文件时,文件模式须要包含 w
,a
或者 x
注意, 使用 w
模式打开文件后,执行写入操做,若是文件已经存在,则会将以前的文件内容所有覆盖,以前的数据内容就丢失了啊。若是不想覆盖,仍是使用 a
模式打开吧。
调用什么方法能够写文件呢? write()
方法,调用成功后,会返回写入文件的字符长度。
来看一个例子
with open('a.txt', 'w') as f: f.write('I am line 1\n') f.write('I am line 2\n')
上面代码中,为何要加 \n
呢?这是用来分行的,要否则都挤在一行了。
注意,这里若是不使用 with
语法糖,也必定要显式的调用使用 close
方法。这不只仅是由于释放资源的缘由:在调用 write()
方法时,操做系统不会马上将数据写入到文件中,而是先在内存中缓存,等到空闲时再写入文件,最后使用 close()
方法才会将数据完整的写入到文件中。
固然,显式调用 flush()
方法也能够将数据当即写入文件中。综合比较,仍是推荐使用 with
的方式,优雅且完善。
除了对文件读和写以外,还会常常用到如获取文件路径,查看文件大小,重命名,删除文件等文件或目录操做。这些操做应该调用哪些方法来完成呢?
刚开始接触 os 模块,就被它强大的 API 列表给震撼了,使用这个模块几乎能够完成全部的平常文件和目录操做。为方便之后查询,我专门将这些经常使用的操做分门别类,作了一个思惟导图。一块儿来看下。
上图中只给出了最简单的功能介绍,若是想要深刻了解具体的方法使用,可参考 python 3.6 os 模块官方地址
学习有时候就是这样,API 太多根本记不住,也没有必要彻底记住,只要常常概括整理,知道要使用的操做在什么地方,叫什么名字,用到的时候去查就能够了。
除了 os 模块,还有一个很是有用的模块 shutil
,它的定位是针对多个文件的高级文件操做(High-level file operations)。相比而言, os 模块大可能是对单个文件而言的喽。下面经过几个经常使用的操做来感觉下:
shutil.copytree('olddir', 'newdir')
olddir
,newdir
只能是目录,并且 newdir
这个目录不存在才能够shutil.move('oldpath','newpath')
shutil.rmtree('dir')
os.rmdir(dir)
,只能删除空目录shutil.rmtree
功能则更高级,不管是空仍是非空目录均可以删除,确实是 High-level
啊 ^_^对我来讲,这三种经常使用的操做就能够了。固然 shutil
的功能远比这些要丰富的多,有兴趣的同窗,能够到 官方文档 去深刻了解下。
本篇主要介绍了 python 中文件经常使用的操做,内容包括打开文件,读文件,写文件,使用 os
和 shutil
模块来操做文件和目录。下篇会介绍 json
和 xml
处理,敬请期待。