Python 文档操作主要包括打开文档、读文档、写文档、修改文档、关闭文档等操作,还会写一些基本操作方法。

打开文档 - open()

在 python,使用 open 函数,可以打开一个已经存在的文档,或者创建一个新文档

open(文档名,访问模式)

示例如下:

1
f = open('test.txt', 'w')

访问模式

说明

r

以只读方式打开文档。文档的指针将会放在文档的开头。这是默认模式。

w

打开一个文档只用于写入。如果该文档已存在则将其覆盖。如果该文档不存在,创建新文档。

a

打开一个文档用于追加。如果该文档已存在,文档指针将会放在文档的结尾。如果该文档不存在,创建新文档进行写入。

rb

以二进制格式打开一个文档用于只读。文档指针将会放在文档的开头。这是默认模式。

wb

以二进制格式打开一个文档只用于写入。如果该文档已存在则将其覆盖。如果该文档不存在,创建新文档。

ab

以二进制格式打开一个文档用于追加。如果该文档已存在,文档指针将会放在文档的结尾。如果该文档不存在,创建新文档进行写入。

r+

打开一个文档用于读写。文档指针将会放在文档的开头。

w+

打开一个文档用于读写。如果该文档已存在则将其覆盖。如果该文档不存在,创建新文档。

a+

打开一个文档用于读写。如果该文档已存在,文档指针将会放在文档的结尾。文档打开时会是追加模式。如果该文档不存在,创建新文档用于读写。

rb+

以二进制格式打开一个文档用于读写。文档指针将会放在文档的开头。

wb+

以二进制格式打开一个文档用于读写。如果该文档已存在则将其覆盖。如果该文档不存在,创建新文档。

ab+

以二进制格式打开一个文档用于追加。如果该文档已存在,文档指针将会放在文档的结尾。如果该文档不存在,创建新文档用于读写。

关闭文档 - close()
1
2
3
4
5
f = open('test.txt', 'w')
f.close()
写文档 - write()
1
2
3
4
f = open('text.txt', 'w')
>>>f.write('hello!')
6
>>>f.close()
读文档 - read()
使用 read(num) 可以从文档中读取数据,num 表示要从文档中读取的数据的长度(单位是字节),如果没有传入 num ,那么就表示读取文档中所有的数据。
1
2
3
4
5
>>>f = open('text.txt', 'r')
>>>content = f.read()
>>>content
'hello!'
>>>f.close()
读数据 - readlines()
readlines 可以按照行的方式把整个文档中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
1
2
3
4
>>>f = open('text.txt', 'r')
>>>result = f.readlines()
>>>result
['hello!n', 'worldn', 'hahan']
读数据 - readline()
1
2
3
4
5
6
7
>>>f = open('text.txt', 'r')
>>>f.readline()
'hello!n'
>>>f.readline()
'worldn'
>>>f.readline()
'hahan'

处理大文档

一般的读取,readlines()、read() 等会将整个文档加载到内存中。在文档较大时,往往会引发 MemoryError(内存溢出)。本人试了用 readlines() 读取一个 2G 大小的日志文档,结果本子直接跑挂。

处理方法一般有以下几种:

逐行读取
1
2
3
4
5
while True:
line = f.readline()
if not line: # 到 EOF,返回空字符串,则终止循环
break
do_something(line)

使用 with 结构

with 语句句柄负责打开和关闭文档(包括在内部块中引发异常时),for line in f 对可迭代对象 f 进行迭代遍历,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文档的问题。

这也是较为推荐使用的方法。

1
2
3
with open(filename, 'rb') as f:
for line in f:

文档的随机读写

获取当前读写的位置 - tell()

在读写文档的过程中,如果想知道当前的位置,可以使用 tell() 来获取。

1
2
3
4
5
6
7
8
9
10
11
12
>>>f = open('/mnt/d/download/catalina.out','r')
>>>str = f.read(3)
>>>str
'Apr'
>>>str = f.read(30)
>>>str
' 25, 2017 10:54:11 AM org.apac'
>>>f.tell()
33
>>>str = f.read(200)
>>>f.tell()
233
定位到某个位置 - seek()

如果在读写文档的过程中,需要从另外一个位置进行操作的话,可以使用 seek()。

seek(offset, from):
offset - 偏移量
from - 方向0 - 表示文档开头
1 - 表示当前位置
2 - 表示文档末尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>>f = open('/mnt/d/download/catalina.out','r')
>>>f.read(30)
'Apr 25, 2017 10:54:11 AM org.a'
>>>f.tell()
30
# 把位置设置为:从文档开头,偏移6个字节
>>>f.seek(6,0)
6
>>>f.tell()
6
# 把位置设置为:离文档末尾,20个字节处,需要已rb模式打开
>>>f = open('/mnt/d/download/catalina.out','rb')
>>>f.seek(-20,2)
2238539151
>>>f.read(10)
b'ged at DEB'
>>>f.read(10)
b'UG level.n'
文档重命名 - os.rename('srcFile', 'destFile')
os 模块中的 rename() 可以完成对文档的重命名操作
删除文档 - os.remove('fileName')
文档夹的相关操作
创建文档夹 - os.mkdir('dirName')
获取当前目录 - os.getcwd()
改变目录 - os.chdir('../')
获取目录列表 - os.listdir('./')
删除文档夹 - os.rmdir('dirName'),不能删除非空目录
1
2
3
4
5
6
7
8
9
10
11
12
>>>os.getcwd()
'/mnt/d/code/Python/itcast'
>>>os.mkdir('test')
>>>os.chdir('test')
>>>os.listdir('.')
[]
>>>os.chdir('../')
>>>os.listdir('./')
['07day_1.py', '07day_2.py', '07day_3.py', '1_1.py', 'func.py', 'test']
>>>os.rmdir('test')
>>>os.listdir('./')
['07day_1.py', '07day_2.py', '07day_3.py', '1_1.py', 'func.py']