Python文件操作
在Python中,不需要导入外部库来读取和写入文件。Python为创建、写入和读取文件提供了内置的函数。
1.open() 方法
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode=‘r’)
完整的语法格式为:
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener:
mode 参数有
参数 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(Python 3 不支持)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
2.打开文件
文件路径
文件路径:主要有两种,一种是使用相对路径,想上面的例子就是使用相对路径。另外一种就是绝对路径,像’ C:/Users/shu/Desktop/python/test.txt’
在桌面上有两个文件:
f = open('test.txt',encoding = 'utf-8')#打开文件
data = f.read() #读文件
print(data)
f.close() #关闭文件
输出结果:
这是一个文件df
使用with打开文件
with open('test.txt',encoding = 'utf-8')as f: #打开文件
data = f.read() #读文件
print(data)
输出结果:
这是一个文件df
通过对两种读取方式的对比发现,第一种方式比较简洁,不用关心流是否关闭,with会在文件不再使用时自动关闭流,并且输出的格式与文件内容中显示的一致。第二种方式就必须要手动显示的关闭流,且输出格式与文件内容不同,需要进行特殊处理,且发生异常之后,可能会导致流未正常关闭。
3.读文件
read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有
fileObject.read()
with open('test.txt','r',encoding = 'utf=8')as f: #打开文件
print('文件名:',f.name)
data = f.read(10) #读文件
print('读取的字符串是',data)
输出结果:
文件名: test.txt
读取的字符串是 这是第一行
这是第
readline() 方法用于从文件读取整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。
fileObject.readline();
with open('test.txt','r',encoding = 'utf=8')as f: #打开文件
print('文件名:',f.name)
date1 = f.readline()#
print('读取第一行:',date1)
data = f.readline(3) #读文件
print('读取的字符串是:',data)
data = f.readline(10) #读文件
print('读取的字符串是:',data)
data = f.readline(10) #读文件
print('读取的字符串是:',data)
输出结果:
文件名: test.txt
读取第一行: 这是第一行
读取的字符串是: 这是第
读取的字符串是: 二行
读取的字符串是: 这是第三行
readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。
如果碰到结束符 EOF 则返回空字符串。
fileObject.readlines( )
with open('test.txt','r',encoding = 'utf=8')as f: #打开文件
print('文件名:',f.name)
for i in f.readlines(): #依次读取每行
i = i.strip() #去掉每行头尾空白
print('读取的数据为:',i)
输出结果:
文件名: test.txt
读取的数据为: 这是第一行
读取的数据为: 这是第二行
读取的数据为: 这是第三行
读取的数据为: 这是第四行
读取的数据为: 这是第五行
读取的数据为: 这是第六行
4.写文件
write() 方法用于向文件中写入指定字符串。
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。
fileObject.write( [ str ])
文件中的内容
这是第一行
这是第二行
这是第三行
这是第四行
这是第五行
这是第六行
with open('test.txt','r+',encoding = 'utf=8')as f: #打开文件
print('文件名:',f.name)
str = '这是第七行'
f.seek(0,2)#在文件末尾写入一行
line = f.write(str)
f.seek(0,0)
for i in range(7):
line = next(f)
print('文件号%d--%s'%(i,line))
输出结果:
文件名: test.txt
文件号0--这是第一行
文件号1–这是第二行
文件号2–这是第三行
文件号3–这是第四行
文件号4–这是第五行
文件号5–这是第六行
文件号6–这是第七行
writelines() 方法用于向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n。
fileObject.writelines( [ str ])
with open('test.txt','w',encoding = 'utf=8')as f: #打开文件
print('文件名:',f.name)
seq = ['卢阿涛1\n','luatao2']
line = f.writelines(seq)
输出结果:
卢阿涛1
luatao2
5.随机存取
seek() 方法用于移动文件读取指针到指定位置。
fileObject.seek(offset[, whence])
offset – 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
with open('test.txt','rb+')as f: #打开文件
print('文件名:',f.name)
f.write(b'0123456789abcdef')
print(f.seek(3))#移动到第3个字节
print(f.seek(-2,2))#移动到文件倒数第2个字节
输出结果:
文件名: test.txt
3
17
tell() 方法返回文件的当前位置,即文件指针当前位置。
fileObject.tell()
返回文件的当前位置。
with open('test.txt','rb+')as f: #打开文件
print('文件名:',f.name)
f.write(b'0123456789abcdef\n')
f.seek(3)
pos = f.tell()
print(pos)
输出结果:
文件名: test.txt
3
6.其他方法
==truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小。 ==
fileObject.truncate( [ size ])
ize – 可选,如果存在则文件截断为 size 字节。
with open('test.txt','r+',encoding = 'utf-8')as f: #打开文件
print('文件名:',f.name)
line = f.readline()
print('读取行:',line)
f.truncate()
line = f.readlines()
print('读取行:',line)
输出结果:
文件名: test.txt
读取行: 1:www.baidu.com
读取行: [‘2:www.baidu.com\n’, ‘3:www.baidu.com\n’, ‘4:www.baidu.com\n’, ‘5:www.baidu.com’]
with open('test.txt','r+',encoding = 'utf-8')as f: #打开文件
print('文件名:',f.name)
f.truncate(10)
str = f.read()
print('读取数据:',str)
输出结果:
文件名: test.txt
读取数据: 1:www.ba
flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
fileObject.flush()
fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
fileObject.fileno();
isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。
fileObject.isatty();
7.迭代文件内容
#每次迭代一个字符
with open('test.txt','r') as f:
while True:
char = f.read(1)
if not char:
break
print(char)
#每次迭代一行数据
with open('test.txt','r') as f:
while True:
line = f.readline()
if not line:
break
print(line)
#读取所有内容 read
with open('test.txt','r') as f:
data = f.read()
print(data)
#读取所有内容 readlines
with open('test.txt','r') as f:
data = f.readlines()
print(data)
#使用fileinput实现延迟迭代,读取实际需要文本的部分
import fileinput
for line in fileinput.input('test.txt'):
print(line)
输出结果:
1
锛
歸
w
w
.
b
a
1锛歸ww.ba
1锛歸ww.ba
[‘1锛歸ww.ba’]
1锛歸ww.ba
8.文件/目录常用的函数使用方法
参数 | 描述 |
---|---|
Getcwd() | 返回当前工作目录 |
Chdir(path) | 改变工作目录 |
Listdir(path = ‘.’) | 列举指定目录中的文件名(‘.’表示当前目录,‘…’表示上一级目录) |
Mkdir(path) | 创建单层目录,如该目录已存在抛出异常 |
Makedirs(path) | 递归创建多层目录,如该目录已存在抛出异常, |
Remove(path)删除文件 | Rmdir(path)删除单层目录,如该目录非空抛出异常 |
Removedirs(path) | 递归删除目录,从子目录到父目录琢层尝试删除,遇到目录非空抛出异常 |
Rename(old,new) | 将文件名重命名 |
System(command) | 运行系统的shell命令 |
9.OS.path模块中关于路径常用的函数使用方法
参数 | 描述 |
---|---|
Basename(path) | 去掉目录路径,单独返回文件名 |
Dirname(path) | 去掉文件名 ,单独返回路径 |
Join(path1[,path2[,…]]) | 将path1,path2各部分组合成为一个路径名 |
Split(path) | 分割文件名与路径,返回(f_path,f_name)元组,如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在 |
Splitext(path) | 分离文件名与扩展名,返回(f_nme,f_extension)元组 |
Getsize(file | 返回指定文件的尺寸,单位是字节) |
Getatime(file) | 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或Localtime()函数换算) |
Getctime(file) | 返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或 |
Localtime()函数换算) | 返回指定文件的最新的修改时间(浮点型秒数,可用time模块gmtime()或Localtime()函数换算) |
以下函数返回True或False
参数 | 描述 |
---|---|
Exists(path) | |
Isabs(path) | 判断指定路径是否为绝对路径 |
Isdir(path) | 判断指定路径是否存在且是一个目录 |
Isfile(path) | 判断指定路径是否存在且是一个文件 |
Islink(path) | 判断指定路径是否存在且是一个符号链接 |
Ismount(path) | 判断指定路径是否存在且是一个挂载点 |
Sameflie(path1,path2) | 判断path1和path2两个路径是否指向同一个文件 |
今天下午又两三个小时吧,写这玩意可真费事啊!