文件操作
encode:编码
decode:解码
encoding="utf-8" :只手一种编码方式,并不是像encode,decode的功能一样,而"utf-8"依赖于文件是以什么方式创建的,以什么方式打开的,
如:记事本是GBK方式创建的,则打开需用GBK编码方式打开,encoding="GBK"
文件名最好以英文命名,不然会在某个环节出错,以什么编码方式存储的,就以什么编码方式打开.
路径问题:
绝对路径:从根目录开始,一级一级查找直到找到文件.eg:D:\\....
相对路径:在同一个文件下(目录)直接写文件名. eg:具体的文件名
一: 读文件模式: r , 默认可以不写,mode="r". 读取出来都为str类型.五种模式
1.全部读出来.f.read()
f = open("log", encoding="utf-8", mode="r") #注意 = 旁边无空格
content = f.read()
print(content)
f.close()
#全部读出来
2.读取一部分,按照字符去读取.(也可以理解为个数) f.read(n)
文件打开方式为文本模式时,代表读取5个字符
文件打开方式为b模式时,代表读取5个字节
f = open("log", encoding="utf-8", mode="r") #注意 = 旁边无空格
content = f.read(5)
print(content)
f.close()
#返回:1.输入工
3.一行一行的读.f.readline().
f = open("log", encoding="utf-8", mode="r") print(f.readline()) print(f.readline()) print(f.readline()) #读多行 f.close() #返回:1.输入工资 \判断是不是整数
4.一行一行的读.将原文件的每一行作为一个列表的元素. f.readlines()
f = open("log", encoding="utf-8", mode="r") #注意 = 旁边无空格 content = f.readlines() print(content) f.close() #返回:['1.输入工资\n', '判断是不是整数\n', '将输入的变为int类型\n', '..
5.循环读取 推荐使用的方法,因为在内存中永远只占一行
f = open("log", encoding="utf-8", mode="r") for i in f: # i就是每一行 print(i.strip()) # strip()去掉隔行符 f.close() #将文件全部读取出来
二.写 w 没有文件,创建一个文件写入内容,有文件,将原文件内容清空,在写入内容.(所以有弊端,容易将之前的内容清楚掉不好)
f = open("log", encoding="utf-8", mode="w") f.write("今天开班会") f.close()
返回:在log文件夹内就可以找到写进去的内容
三,读写模式: r+ 先读,后追加,一定要先读后追加
f = open("log", encoding="utf-8", mode="r+")
content = f.read() #比如之前文件里的内容为:今天开班会
f.write("AAA") #读完之后再写入AAA
print(content) #最后再打印
f.close()
with open("log1", encoding="utf-8", mode="r+")as f: content = f.read() f.write("AAA") f.read() print(content)
四,写读模式 w+ 先写后读
f = open("log", encoding="utf-8", mode="w+")
f.write("中国")
print(f.read())
print(f.tell()) #按照字节去读光标的位置
f.seek(3) #按照字节调整光标位置
print(f.read())
f.close()
#返回:6 国
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
with open("log1", encoding="utf-8", mode="w+")as f2: f2.write("今天在家学习") f2.tell() f2.seek(6) print(f2.read())
五.追加 a 没有文件创建一个文件追加内容,有文件直接追加内容.
f = open("log1", encoding="utf-8", mode="a")
f.write("666") #创建一个新的以log1命名的新文件,内容为666
f.close()
六.以bytes类型,进行的读, 写,文件操作. 以bytes类型写入就需转成bytes类型后再写入.非文件的文件是用rb读取,什么是非文件比如视频,图片.
只举一种写的例子:
f = open("log", mode="wb") f.write("老男孩".encode("utf-8")) #中文的字符串转换成bytes类型,就需encode(utf-8),转换一下
f.close() #返回:在文件夹log中,写入了老男孩
七.其他方法:truncate 按字节对原文件截取.
一,truncate是截断文件,所以文件的打开方式必须可读,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
f = open("log1", encoding="utf-8", mode="a")
f.truncate(2)
f.close()
二,自动关闭文件句柄 with open
#功能一,省去自动关闭文件句柄
with open("log1",encoding="utf-8",mode="r") as f: #读 print(f.read())
#功能二,省去自动关闭文件句柄,利用一个位置去操作多个文件句柄
with open("log1", encoding="utf-8", mode="r") as f1,\
open("log2", encoding="utf-8", mode="w") as f2:
print(f1.read())
print(f2.write("hahhah")) #可以用任意模式去操作.可以r,w.a
八,文件修改,实际操作
1.将源文件读取到内存
2.在内存中进行修改,形成新的字符串(文件 )
3.将新的字符串写入新文件
4.将原文件删除
5.将新文件重命名成原文件
例题:有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的nb。
import os #引用模块 with open("log1", encoding="utf-8", mode="r") as f,\ #以读模式打开原文件 open("log1.back", encoding="utf-8", mode="w") as f2: #以写的模式打开log1.back文件 content = f.read() #将读的文件赋给一个变量,不能每次都写f.read() new_content = content.replace("alex", "nb") #通过旧文件用replcae方法将alex修改为nb,赋值给新的文件 f2.write(new_content) #将新的写入f2中,即log1.back的文件中 os.remove("log1")#将原来的文件(log1)删除 os.rename("log1.back", "log1") #重新命名为log1
#但求理解,即使是初级版本,也必须是要理解的.
高级版本写法: import os with open("log1", encoding="utf-8", mode="r") as f,\ open("log1.back", encoding="utf-8", mode="w") as f2: for i in f: new_i = i.replace("nb", "alex") f2.write(new_i) #这里不能加引号,加引号就是写进去单个字符串,而不是将修改过后的文件new_i写进去 os.remove("log1") os.rename("log1.back", "log1")