一、方法介绍
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)