一、方法介绍
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意: 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
1
#
open函数的语法格式
2
3
open(file, mode=
'
r
'
, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=
None)
4
file: 必需,文件路径(相对或者绝对路径)。
5
mode: 可选,文件打开模式
6
buffering: 设置缓冲
7
errors: 报错级别
8
newline: 区分换行符
9
closefd: 传入的file参数类型
mode的参数有:
|
模式
|
描述
|
|
r
|
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
|
|
w
|
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
|
|
a
|
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
|
|
rb
|
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
|
|
r+
|
打开一个文件用于读写。文件指针将会放在文件的开头。先读后写才是安全的
|
|
rb+
|
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
|
|
w+
|
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
|
|
wb+
|
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
|
|
wb
|
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
|
|
ab
|
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
|
|
a+
|
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
|
|
ab+
|
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
|
file中的常用方法:
|
方法
|
描述
|
|
file.close()
|
关闭文件。关闭后文件不能再进行读写操作。
|
|
file.flush()
|
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
|
|
file.next()
|
返回文件下一行
|
|
file.read([size])
|
从文件读取指定的字节数,如果未给定或为负则读取所有
|
|
file.readline([size])
|
读取整行,包括 "\n" 字符。
|
|
file.readlines([sizehint])
|
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint
字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。
|
|
file.seek(offset[, whence])
|
设置文件当前位置
|
|
file.tell()
|
返回文件当前位置。
|
|
file.truncate([size])
|
截取文件,截取的字节通过size指定,默认为当前文件位置。
|
|
file.write(str)
|
将字符串写入文件,没有返回值
|
|
file.writelines(sequence)
|
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
|
二、文件的操作
2.1 读取文件
2.1.1 read
1
#
路径有两种:
2
#
1.相对路径,相对于当前程序所在的文件夹
3
#
../ 返回上一层目录
4
#
相对的是当前程序所在的文件夹
5
#
2.绝对路径
6
#
* 从磁盘根目录寻找
7
#
* 互联网上的绝对路径
8
9
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
10
11
#
read函数的参数是读取多少个字节,如果不加参数,默认是一次性读取文件的所有内容
12
data =
f.read()
13
#
打印读取的文件内容
14
print
(data)
15
16
#
关闭文件
17
f.close()
2.1.2 readlines
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
data =
f.readlines()
#
打印读取的文件内容
print
(type(data))
#
#
关闭文件
f.close()
2.1.3 readline
读取一行数据
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
#
只读取一行数据
data =
f.readline()
#
打印读取的文件内容
print
(data)
#
关闭文件
f.close()
2.1.4 读取大文件
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
#
读取大文件的方法
for
line
in
f:
print
(line)
#
关闭文件
f.close()
对可迭代对象 f,进行迭代遍历:
for line in f
,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。
2.2 写文件
1
#
w 模式写文件会将源文件覆盖
2
f = open(
"
a.txt
"
, mode=
"
w
"
, encoding=
"
utf-8
"
)
3
4
f.write(
"
aaa
"
)
5
#
关闭
6
f.close()
1
#
追加
2
f = open(
"
a.txt
"
, mode=
"
a
"
, encoding=
"
utf-8
"
)
3
f.write(
"
ddd
"
)
4
f.flush()
5
f.close()
1
#
r+ 默认模式指针在文件的开头
2
#
f = open("老师点名", mode="r+", encoding="utf-8")
3
#
s = f.read()
4
#
print(s)
5
#
f.write("周杰伦")
6
#
f.close()
7
#
神坑
8
f = open(
"
精品
"
, mode=
"
r+
"
, encoding=
"
utf-8
"
)
9
s = f.read(3)
#
读3个字符
10
#
不管你前面读了几个,后面去写都是在末尾
11
f.write(
"
aabbcc
"
)
#
没有任何操作之前进行写,在开头写,如果读取了一些内容后再写,则是在最后
12
f.flush()
13
f.close()
文件内的光标移动
1
一: read(3
):
2
1
. 文件打开方式为文本模式时,代表读取3个字符
3
2
. 文件打开方式为b模式时,代表读取3个字节
4
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
5
seek(offset[, whence])
6
offset --
开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始
7
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2
代表从文件末尾算起。
8
9
10
注意:
11
1. seek有三种移动方式0,1,2
,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
12
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+
等模式下测试效果
13
1
#
!/usr/bin/python3
2
3
#
打开文件
4
fo = open(
"
runoob.txt
"
,
"
r+
"
)
5
print
(
"
文件名为:
"
, fo.name)
6
7
line =
fo.readline()
8
print
(
"
读取的数据为: %s
"
%
(line))
9
10
#
重新设置文件读取指针到开头
11
fo.seek(0, 0)
12
line =
fo.readline()
13
print
(
"
读取的数据为: %s
"
%
(line))
14
15
16
#
关闭文件
17
fo.close()
2.3 with操作
1
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
2
with open(
'
log
'
,
'
r
'
) as f:
3
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
4
5
在Python 2.7
后,with又支持同时对多个文件的上下文进行管理即:
6
with open(
'
log1
'
) as obj1, open(
'
log2
'
) as obj2:
1
with open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
) as f:
2
data =
f.read()
3
print
(data)
#
提示输入文件
oldFileName = input(
"
请输入要拷贝的文件名字:
"
)
#
以读的方式打开文件
oldFile = open(oldFileName,
'
rb
'
)
#
提取文件的后缀
fileFlagNum = oldFileName.rfind(
'
.
'
)
if
fileFlagNum >
0:
fileFlag
=
oldFileName[fileFlagNum:]
#
组织新的文件名字
newFileName = oldFileName[:fileFlagNum] +
'
[复件]
'
+
fileFlag
#
创建新文件
newFile = open(newFileName,
'
wb
'
)
#
把旧文件中的数据,一行一行的进行复制到新文件中
for
lineContent
in
oldFile.readlines():
newFile.write(lineContent)
#
关闭文件
oldFile.close()
newFile.close()
2.4 文件的相关操作
1
import
os
2
3
#
文件重命名
4
os.rename(
"
毕业论文.txt
"
,
"
毕业论文-最终版.txt
"
)
5
6
#
删除文件
7
os.remove(
"
毕业论文.txt
"
)
8
9
#
创建文件夹
10
os.mkdir(
"
abc
"
)
11
12
#
获取当前目录
13
os.getcwd()
14
15
#
改变默认目录
16
os.chdir(
"
../
"
)
17
18
#
获取目录列表
19
os.listdir(
"
./
"
)
20
21
#
删除文件夹
22
os.rmdir(
"
abc
"
)
#
创建新文件,把修改后的文件写入新文件,删除老文件,再重命名新文件
import
os
with open(
"
吃的
"
, mode=
"
r
"
, encoding=
"
utf-8
"
) as f1, \
open(
"
吃的_副本
"
, mode=
"
w
"
, encoding=
"
utf-8
"
) as f2:
for
line
in
f1:
new_line
= line.replace(
"
肉
"
,
"
菜
"
)
f2.write(new_line)
os.remove(
"
吃的
"
)
#
删除文件
os.rename(
"
吃的_副本
"
,
"
吃的
"
)
#
重命名文件
#
coding=utf-8
#
批量在文件名前加前缀
import
os
funFlag
= 1
#
1表示添加标志 2表示删除标志
folderName =
'
./renameDir/
'
#
获取指定路径的所有文件名字
dirList =
os.listdir(folderName)
#
遍历输出所有文件名字
for
name
in
dirList:
print
name
if
funFlag == 1
:
newName
=
'
[东哥出品]-
'
+
name
elif
funFlag == 2
:
num
= len(
'
[东哥出品]-
'
)
newName
=
name[num:]
print
newName
os.rename(folderName
+name, folderName+newName)

