今日大纲
1.文件操作初识
2.r, w, a
3.文件操作常用方法
1.文件操作初识
1)Python代码
path 文件路径:E:\辰东.txt
encoding 编码方式:utf-8,gbk.... (说明原文件的的编码方式)
mode 操作方式: 只读,只写, 追加,读写,写读.....
路径: 绝对路径:从根目录开始一直找到文件。
相对路径:从当前目录开始找到的文件。
绝对路径打开文件
f1 = open("E:\辰东.txt",encoding="utf-8",mode="r")
print(f1.read())
f1.close()
相对路径打开文件
f1 = open("辰东小说",encoding="utf-8")
print(f1.read())
f1.close()
2)凡是带b不用encoding
只有是r模式 mode='r'可以省略不写
3)常见错误原因分析:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte
编码错误:文件存储时编码方式与文件打开时的编码方式不一致。
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \uXXXX escape
两种:
第一种:加r
f1 = open(r'd:\u联系方式.txt', encoding='GB2312', mode='r')
print(f1.read())
f1.close()
第一种:加\
f1 = open('d:\\u联系方式.txt', encoding='GB2312', mode='r')
print(f1.read())
f1.close()
2.r, w, a
变量 f1_obj,f1_file,file,file_handle... 文件句柄。
open Python的内置函数,但是底层调用的windows系统的open功能,open功能就是操作文件用的。
windows系统默认的编码方式gbk, linux\macos:utf-8.
流程: 1)打开文件,产生文件句柄。
2)对文件句柄进行相应的操作。
3)关闭文件。
f1 = open("辰东小说",encoding="utf-8",mode="r")
print(f1.read())
f1.close()
2.1 读模式
(1)r
1)read
f.read() 全部读出来
f1 = open("辰东小说",encoding="utf-8")
print(f1.read())
f1.close()
2)read(n)
r模式下的read(n),n是字符,按照字符个数来读取
f1 = open("辰东小说",encoding="utf-8")
print(f1.read(3))
f1.close()
3)readline()
按行读取
f1 = open("辰东小说",encoding="utf-8")
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()
4)readlines()
readlines() 返回一个list 里面的元素是每一行。列表中有一个元素便在内存中占一个位置
f1 = open("辰东小说",encoding="utf-8")
print(f1.readlines())#['遮天、神墓、完美世界、长生界、不死不灭、圣墟\n', '待到阴阳逆乱时,\n', '以我魔血染青天!']
f1.seek(0) #将光标移动到第一个元素前
for line in f1.readlines():
print(line)
f1.close()
5)for循环 最好的
for循环,每次遍历的元素在内存中始终占去一个位置,从内存角度来说,是最好的
f1 = open("辰东小说",encoding="utf-8")
for i in f1:
print(i)
f1.close()
(2)rb 非文字类的文件
1)read
f.read() 全部读出来
f1 = open("辰东小说",mode="rb")
print(f1.read()) #读取文件中全都的bytes
f1.close()
2)read(n)
rb模式下的read(n),n是字节,按照字节个数来读取
f1 = open("辰东小说",mode="rb")
print(f1.read(3))
f1.close()
3)readline()
按行读取
f1 = open("辰东小 说",mode="rb")
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()
(3)r+
就是读的基础上加了一个功能
先读,后写!
f1 = open("辰东小说",encoding="utf-8",mode="r+")
print(f1.read())
f1.write("!坑神所著!")
f1.close()
(4)r+b
读写,先读后写
以bytes类型操作的读写
f1 = open("辰东小说",mode="r+b")
print(f1.read())
f1.write("!坑神所著!".encode("utf-8"))
f1.close()
2.2 写模式
(1)w wb
w:没有文件,创建文件写内容。
f1 = open("宅猪",encoding="utf-8",mode="w")
f1.write("《帝尊》")
f1.close()
w:如果有文件,先清空原文件,写入新内容。
f2 = open("宅猪",encoding="utf-8",mode="w")
f2.write("《牧神记》")
f2.close()
wb:没有文件,创建文件写内容。
f1 = open("天蚕土豆",mode="wb")
f1.write("《斗破苍穹》".encode("utf-8"))
f1.close()
wb:如果有文件,先清空原文件,写入新内容。
f2 = open("天蚕土豆",mode="wb")
f2.write("《武动乾坤》".encode("utf-8"))
f2.close()
(2)w+
先写后读
f1 =open("金庸",encoding="utf-8",mode="w+")
f1.write("《天龙八部》") #写完后,光标停在最后位置
f1.seek(0) #调整光标到初识位置 n表示字节
print(f1.read())
f1.close()
(3)w+b bytes类型的先写后读
f1 =open("金庸",mode="w+b")
f1.write("《神雕侠侣》".encode("utf-8")) #写完后,光标停在最后位置
f1.seek(0) #调整光标到初识位置
print(f1.read())
f1.close()
2.3 追加模式
(1)a ab
a:没有文件,创建文件写内容。
f1 = open("古龙",encoding="utf-8",mode="a")
f1.write("《小李飞刀》")
f1.close()
a:有文件,直接在原文件的后面追加新内容。
f2 = open("古龙",encoding="utf-8",mode="a")
f2.write("《天涯明月刀》")
f2.close()
ab:没有文件,创建文件写内容。
f1 = open("古龙",mode="ab")
f1.write("《萧十一郎》".encode("utf-8"))
f1.close()
ab:有文件,直接在原文件的后面追加新内容。
f2 = open("古龙",mode="ab")
f2.write("《绝代双骄》".encode("utf-8"))
f2.close()
(2) a+追加可读
f1 = open("古龙",encoding="utf-8",mode="a+")
f1.write("《陆小凤传奇》")
f1.seek(0)
print(f1.read())
f1.close()
(3)a+b bytes类型的追加可读
f1 = open("古龙",mode="a+b")
f1.write("《陆小凤传奇》".encode("utf-8"))
f1.seek(0)
print(f1.read())
f1.close()
(4) 非文字的文件的读取写入
f1 = open("胡歌.jpg",mode="r+b")
hu_ge = f1.read()
print(hu_ge)
f1.close()
f2 = open("古月哥欠.jpg",mode="w+b")
f2.write(hu_ge)
print(f2.read())
f2.close()
3.文件的常用操作方法
(1)readlable() writeable()判断是否可读或者可写
f1 = open("辰东小说",encoding="utf-8")
print(f1.readable()) #True
print(f1.writable()) #False
f1.close()
f2 = open("辰东小说",encoding="utf-8",mode="w+")
print(f2.readable()) #True
print(f2.writable()) #True
f2.close()
(2)seek: 按照字节去调整光标
f1 = open("辰东小说", encoding='utf-8')
f1.seek(3)
print(f1.read())
f1.close()
f1.seek(0,2)将光标调整到最后
(3)tell 告诉光标的位置
f1 = open("辰东小说", encoding='utf-8')
print(f1.tell())
print(f1.read())
print(f1.tell())
f1.close()
(4)truncate 对原文件进行截取内容,以字节形式,只能在a模式下使用
f1 = open("辰东小说", encoding='utf-8',mode="a")
f1.truncate(3) #n是字节
f1.close()
(5)文件操作的另一种写法
with open() as 不用主动关闭 f1.close()
同一open 可以操作多个文件
with open("天蚕土豆",encoding="utf-8") as f1,\
open("辰东小说",encoding="utf-8",mode="a") as f2:
print(f1.read())
f2.write("完")
with open("天蚕土豆",encoding="utf-8") as f1:
content = f1.read()
with open("天蚕土豆", encoding="utf-8",mode="a") as f2:
f2.write("完美世界")
(6)补充:
gbk utf-8
对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
s1 = '123abc*'
b1 = s1.encode('utf-8')
s2 = b1.decode('gbk')
print(s2)
4.文件的改
1)打开原文件 old_file,将原内容读取到内存。
2)创建一个新文件new_file。
3)将原内容通过你改写形成新内容,写入到新文件。
4)将原文件删除。
5)将新文件重命名成原文件。
例题:有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
方法一:
import os
with open("第二题",encoding="utf-8") as f1,\
open("第二题新",encoding="utf-8",mode="w") as f2:
s1 = f1.read()
s2 = s1.replace("alex","SB")
f2.write(s2)
os.remove("第二题")
os.rename("第二题新","第二题")
方法二:
import os
with open("第二题",encoding="utf-8") as f1,\
open("第二题新",encoding="utf-8",mode="w") as f2:
for line in f1:
new_line = line.replace("SB", "alex")
f2.write(new_line) #写的动作在for循环中,循环不结束,写的动作不停止,因此 write不会对上次写的内容做情空处理
os.remove("第二题")
os.rename("第二题新", "第二题")