第六章 文件操作
6.1 访问模式
使用Python来读写文件是非常简单的操作,可以使用open函数来打开一个已经存在的文件或者创建一个新文件。
open(文件名,访问模式)
open中第一个参数放入的是要打开的文件名字,第二个参数是要对这个文件进行的操作。示例如下:
f = open("test.txt","w") # 打开文件,w模式,文件不存在则新建 f.close() #关闭文件
f 可写成任意变量等,它被称作:文件句柄,文件操作符,或者文件操作对象等。
流程是打开文件,产生一个文件句柄,对文件句柄进行相应操作,关闭文件。
打开文件的方式:
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖,如果不存在则创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在文件指针会放在文件结尾,如果不存在则创建新文件写入。 |
rb | 以二进制格式,只读方式打开文件。文件的指针会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖,如果不存在则创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在文件指针会放在文件结尾,如果不存在则创建新文件写入。 |
r+ | 打开一个文件用于读写,文件指针放在文件开头。 |
w+ | 打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在则创建新文件。 |
a+ | 打开一个文件用于读写,如果该文件已存在文件指针会放在文件结尾,如果不存在则创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写,文件指针放在文件开头。 |
wb+ | 以二进制格式打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在则创建新文件。 |
ab+ | 以二进制格式打开一个文件用于读写,如果该文件已存在文件指针会放在文件结尾,如果不存在则创建新文件用于读写。 |
6.2 文件路径
绝对路径:从根目录下开始一直到文件名。
相对路径:同一个文件夹下面的文件,直接写文件名就可以。
我们在使用绝对路径的时候因为有\这样程序是不能识别的,解决方法:
open('C:\Users\Meet') #这样程序是不识别的
解决方法一:open('C:\\Users\\Meet') #这样就成功的将\进行转义 两个\\代表一个\
解决方法二:open(r'C:\Users\Meet') #这样相比上边的还要省事,在字符串的前面加个小r也是转义的意思
在文件操作过程中更推荐大家使用相对路径,因为把这个程序的整个文件发送给别人的时候,就可以运行,如果使用绝对路径还需要额外的拷贝外部文件。
6.3 常用操作
读模式
read()
read()是将文件中所有的内容都读取
f = open('test.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)
read()可以指定我们想要读取的内容数量
f = open('test.txt',mode='r',encoding='utf-8')
msg = f.read(3) #读取前三个字符
msg1 = f.read() #后边在读就会继续向后读取
f.close()
print(msg)
print(msg1)
上边现在使用的是r模式这样读取的就是文字,如果使用rb模式读取出来的就是字节
f = open('test.txt',mode='rb')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)
read()的弊端就是当文件很大的时候,将文件中的内容全部读取,存放在内存中这样会导致内存崩溃
readline()
readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个\n
f = open('test.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
msg4 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
结果这里每个一内容中间都有一个空行是因为咱们读取的内容后边都带有一个\n print()的时候会将这个\n执行
f = open('test.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline().strip()
msg3 = f.readline()
msg4 = f.readline().strip()
f.close()
print(msg1,end="")
print(msg2,end="")
print(msg3)
print(msg4)
解决这个问题只需要在我们读取出来的文件后边加一个strip()或者在打印的时候加一个,end=""
readlines()
readlines() 将每一行形成一个元素,放到一个列表中,将所有的内容全部读出来,如果文件很大,占内存,容易崩盘。
f = open('test.txt',encoding='utf-8')
print(f.readlines())
f.close()
使用for循环遍历读取:
f = open('test.txt',mode='r',encoding='utf-8')
content = f.readlines()
i = 1
for temp in content:
print("第%d行:%s"%(i,temp),end="")
i += 1
f.close()
注意点:读完的文件句柄一定要关闭
写模式
覆盖写
在写文件的时候我们要养成一个写完文件就刷新的习惯. 刷新flush()
f = open('test1.txt',mode='w',encoding='utf-8')
f.write('苍井空')
f.flush()
f.close() 结果:当我选择使用w模式的时候,在打开文件的时候就就会把文件中的所有内容都清空,然后在操作
注意点:如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空.
wb模式下,不可以指定打开文件的编辑,但是写文件的时候必须将字符串转换成utf-8的bytes数据
f = open('test1.txt',mode='wb')
msg = '你好'.encode('utf-8')
f.write(msg)
f.flush()
f.close()
追加写
只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置.在追加模式下,我们写入的内容后追加在文件的末尾
a模式如果文件不存在就会创建一个新文件
f1 = open('test1.txt',mode='a',encoding='utf-8')
msg = f1.write('人生苦短')
读写模式
对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+
r+模式
看下正确的操作:
f1 = open('test1.txt',mode='r+',encoding='utf-8')
msg = f1.read()
f1.write('这支烟灭了以后')
f1.flush()
f1.close()
print(msg) #结果:先正常的读取内容之后,再添加语句在结尾
看下错误的操作:
f1 = open('test1.txt',mode='r+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
print(msg) #结果:这样写会把小鬼写在开头,并且读出来的是小鬼之后的内容
r+模式一定要记住是先读后写
r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行的操作.
写读模式
先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用
f1 = open('test2.txt',mode='w+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
print(msg)
有人说,先读在写不就行了.w+模式下 其实和w模式一样,把文件清空了,在写的内容.所以很少人用
追加读(a+,a+b)
a+模式下,不论是先读还是后读,都是读不到数据的
f = open('test2.txt',mode='a+',encoding='utf-8')
f.write('小妹')
f.flush()
msg = f.read()
f.close()
print(msg)
6.4 其他操作
import os | 导入模块 |
---|---|
os.rename(“test.txt”,“test1.txt”) | 文件重命名 |
os.rename(“test1.txt”) | 删除文件 |
os.mkdir(“test”) | 创建文件夹 |
os.rmdir(“test”) | 删除文件夹 |
os.getcwd() | 获取当前目录 |
os.chdir("…/") | 改变默认目录 |
os.lisdir("./") | 获取目录列表 |