python学习之文件操作
4.3 文件操作
4.3.1 初识
语法:f = open('文件路径',mode='模式',encoding='编码')
open:调用操作系统打开文件
mode:对文件的操作方式;默认使用只读模式;b表示以字节的方式打开
encoding:文件编码;以字节的方式打开文件时,可以不用加encoding
windows使用的是GBK,mac OS和nuix使用的是UTF-8;UTF-8是最常用的编码集
f :文件句柄,给读取的文件一个标记,用于文件操作
所有的操作公用一个光标,read命令执行按照光标所在文件位置往下进行,
mode | 描述 | mode | 描述 |
---|---|---|---|
r 只读 | 默认模式,文件不存在时报错 | w 只写 | 不可读;文件不存在时则创建;文件存在时则清空内容 |
r+ 读写 | 可读可写;先读后写 | w+ 写读 | 可写可读,文件不存在时则创建;文件存在时先清空内容 |
rb 只读 | 读取的数据类型是Bytes;在rb模式下,不能选择encoding字符 | wb 只写 | 写入的数据类型是Bytes |
r+b | 可读可写,数据类型是Bytes | w+b | 可读可写,数据类型是Bytes |
a 追加只写 | w文件不存在时则创建; 文件存在时则只追加内容 |
a+ 追加写读 | 可写可读 |
ab 追加可读 | 数据类型是Bytes | a+b | 数据类型是Bytes |
x 只写 | 不可读;文件不存在时则创建;<文件存在时则报错 | x+ 写读 | 可写可读 |
带b的模式是是打开非文本文件时使用的。
4.3.2 只读操作r,rb
r读文本文件,rb读取非文本文件
f=open('D:\mayungerencangku\day01\ceshi.txt',mode='r',encoding='UTF-8')
s = f.read() #全部读取,按照字符读取;光标位于文件尾部
s1 = f.readline() #读取一行
print(s1,)
s2 = f.readlines() #按行为以列表的形式输出
print(s2)
for i in f: #迭代读取,该方式较为安全,能够防止内存溢出
print(i)
f.close() #操作完之后,关闭文件
tips:
.read() ---括号里不给数字是默认全读,全部读取时应防止文件过大造成内存溢出;如果()给出数字就表示读取相应的字符数,这里请注意,换行符占一个字符;
.readline() ---按行进行读取;添加参数,表示读取本行前几个字符
.readlines() ---按行进行全部输出,输出为列表
.close() ---把打开的文件关闭,良好的习惯
for循环读取能够防止内存溢出
注意使用r,防止转义,如下例:
f = open('C:/Users/lenovo/Pictures/Saved Pictures/timg.jpg',mode='rb',)
f = open(r'C:\Users\lenovo\Pictures\Saved Pictures\timg.jpg',mode='rb',)
注意的问题:
open()文件时:
1.路径一定要正确,确保文件后缀正确;
2.如果没有设置encoding的话,默认跟随系统走,Windows使用的是GBK,此时如果文件使用的是UTF-8,那么打开时会报错;
3.带b模式打开文件时,不能指定encoding;
4.3.3 写操作w,wb,a
.write()
在带w的模式下第一次执行write的时候,会先清空原来的内容,之后可正常write;
如果没有该文件,则创建新的文件;
在a模式下,不清空文件,为实在文件末尾进行添加
.flush() 刷新输入管道,把内存中的文件刷到硬盘中,关闭文件前使用
f = open('D:\mayungerencangku\day01\ceshi.txt',mode='a',encoding='UTF-8')
f.write('hahaha')
f.flush() #刷新输入的管道
f.close() #关闭文件
wb模式下,可以不指定打开⽂件的编码,但是在写⽂件的时候必须将字符串转化成utf-8的bytes数据
f = open("小wa娃", mode="wb")
f.write("金毛狮王".encode("utf-8"))
文件拷贝
用r模式打开一个文件,把内容读取写到一个用w模式打开的文件中
f = open('C:/Users/lenovo/Pictures/Saved Pictures/timg.jpg',mode='rb',) ##注意这里的文件路径使用的是unix方式
f1 = open('d:/ceshi.jpg',mode='wb',)#内存使用率高
f1.write(f.read())
for line in f: #这种方式比较安全,文件过大时,防止内存溢出
f1.write(line)
f.close()
f1.flush()
f1.close()
4.3.4 文件路径
1.绝对路径
1.从此盘根目录寻找
2.网络上的路径
2.相对路径
相对于当前程序所在的文件夹,去到其他的文件,实际应用较多,相对安全。
import os
print(os.getcwd()) #查看绝对路径
../去上一级文件夹
f = open('../ceshi/ceshi.txt',mode='r',encoding='UTF-8')
s = f.readline()
print(s)
4.3.5 r+ w+ a+
r+模式
f = open('../ceshi/ceshi.txt',mode='r+',encoding='UTF-8')
s = f.readline()
f.write('jjzz')
#s = f.readline()
print(s)
f.flush()
f.close()
注意大坑:在r+模式下,若果没有执行read操作,默认是从文件的开头进行write,把原来的内容覆盖;如果有read操作,把无论读了多少字符,write都会把内容写在文件的末尾。
正确用法:先读再写
w+模式
用的很少,因为写入前要先清空文件
正确用法:先写后读,读的时候配合f.seek()光标移动到开头进行查看
a+模式
4.3.6 操作方法
1.光标
r 模式下,光标默认在文件在最开头,每读一次,光标往后是动一次,单位是字符。
w 模式下,因为要先清空文件内容,光标会停在文件开头
a 模式下,追加模式,光标在文件末尾
.tell()可以查看光标在哪里,tell的单位是字节
.seek()的单位也是字节
光标移动到末尾:seek(0,2),第一个参数:偏移量;第二个参 数:位置
seek(偏移量,位置) 当前位置表示:0开头;1当前位置;2末尾
2. 截断文件
.truncate()把光标后边的内容删掉
.truncate(12)给参数之后,截断到光标位置
4.3.8 其他功能
.fileno()返回文件句柄在内存中的索引值
.flush()把文件从内存中强制刷到硬盘
.readable()判断是否可读
.writeable()判断文件是否可写
4.3.9 with open()
语法:with open ('文件路径',mode='模式',encoding='编码') as f
with open ('111.txt',mode='r',encoding='utf-8') as f ,\
open ('222.txt',mode='w',encoding='utf-8') as g :
s = f.read
print(s)
tips:打开多个文件时,代码较多可以在代码中间加一个 \ 然后换行即可。
with open ()面向对象中上下文管理
使用的参数与open一致
优势:
能够自动关闭文件;
能够同时打开操作多个文件;
能够同时用r和w操作同一个文件;
4.3.10 修改文件
with open (路径,模式,encoding) as 变量名,open(路径,模式,encoding) as 变量名2:
import os
for line in f1 :
new_line = line.replace('aa','bb')
f2.write(new_line)
os.remove('文件名1')
os.rename('文件名2',‘文件名1)
注意:实际应用时,不要轻易使用.remove ,我们可以对老文件进行rename进行重命名作为备份。