代码的存储可以通过定义变量来存储,但是变量存储代码,这只能存在内存中,一旦关闭,原先的代码就会消失,所以我们需要把代码通过文件的形式,永久将代码保存在硬盘中,所以需要学会文件的基本操作。
文件的只读和只写模式分别为r和w
1. 先建立一个文件demo1.txt , 并写入内容
查看demo1文件中的内容
# 我们在桌面上操作文件:1.打开文件;2.读取文件; 3.关闭文件 f = open("demo1.txt", "r", encoding="utf-8")
# f = open(r"C:UsersdylDesktopdemo3.txt", "r", encoding='utf-8') r代表转义,后面的r代表read模式
print(f.read())
f.close()
"""
1. 打开文件操作 demo1.txt 文件的路径 文件的路径可以是绝对路径,也可以是相对路径,绝对路径比较死,如果文件的路径发生了改变,那么打开文件的路径就要相对地改,所以我们尽量用相对路径
如果是绝对路径,需要用r""转义符 "r" 是只读模式 encoding 是指定文件的编码方式 如果桌面文件的编码方式与指定的编码方式不一样,那么就会报错 (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape 2.读取文件内容 读取文件内容的方法:read 调用方法 变量 f.read() 打印读取的内容 print(f.read()) 3. 关闭文件
文件对象打开后,一定要记得关闭,如果不关闭,这个文件就会占用操作系统的资源,而且操作系统同一时间打开的文件数量是有限的
f.close()
"""
2. 只写模式
# 只写入模式 w
s = """
春晓
春眠不觉晓
处处闻笛鸟
夜来风雨声
花落知多少
"""
f = open("demo1.txt", "w", encoding="utf-8")
# writelines 和write的用法相似,但是writelines可以传入字符串,也可以传入字符序列,但是不能传入数字,每个元素之间如果要换行,就需要用 换行符,write只能传入字符串
f.write(s) f.close() # 写入之后读取 f = open("demo1.txt", "r", encoding="utf-8") print(f.read()) f.close()
春晓
春眠不觉晓
处处闻笛鸟
夜来风雨声
花落知多少
注意:文件对象打开后,一定要记得关闭,如果不关闭,这个文件就会占用操作系统的资源,而且操作系统同一时间打开的文件数量是有限的
只读和只写时,都是先将内容读或者写到缓存区里面,然后等缓存区的空间都满了之后,操作系统就会将内容写到硬盘里面,缓存区里面的内容每满一次,操作系统就会写一次。这样写的劣处就是,我们写的内容可能都没有写到硬盘里面,一旦断电,写的东西就会消失,所以我们需要flash,不用等操作系统来写,直接刷新缓存区,保存内容 f = open("demo.txt", "w", encoding="utf-8") f.writelines(["China ", "World ", "Fuiture "]) # 刷新缓存区,保存内容 f.flush() f.close() f = open("demo.txt", "r", encoding="utf-8") print(f.read()) f.flush() f.close()
# 关闭语句f.close(),可以节省内存中缓存资源,所以这句一定要带上,但是每对文件增删改查一次,就需要写一次,这并不方便,with语句就可以省去这一步 with open("demo1.txt", 'r', encoding='utf-8') as f: print(f.read())
春晓
春眠不觉晓
处处闻笛鸟
夜来风雨声
花落知多少
with只写进入
# 关闭语句f.close(),可以节省内存中缓存资源,所以这句一定要带上,但是每对文件增删改查一次,就需要写一次,这并不方便,with语句就可以省去这一步 with open("demo1.txt", 'r', encoding='utf-8') as f: print(f.read()) s2 = """ 满城尽带黄金甲,不破楼兰终不还。 """ with open("demo1.txt", 'w', encoding='utf-8') as f: f.write(s2) with open('demo1.txt', 'r', encoding='utf-8') as f: print(f.read())
满城尽带黄金甲,不破楼兰终不还。
3. tell和seek
tell() 以bytes为单位,从文件头到当前指针所在的位置
seek() 以bytes为单位,光标的偏移量
s3 = s2.encode() print(s3) # b' xe6xbbxa1xe5x9fx8exe5xb0xbdxe5xb8xa6xe9xbbx84xe9x87x91xe7x94xb2xefxbcx8cxe4xb8x8dxe7xa0xb4xe6xa5xbcxe5x85xb0xe7xbbx88xe4xb8x8dxe8xbfx98xe3x80x82 ' # utf-8编码中文字符,是三个字节编码一个中文字符 with open("demo1.txt", 'w', encoding='utf-8') as f: f.write(s2) with open('demo1.txt', 'r', encoding='utf-8') as f: print(f.tell()) # 0 光标的位置 print(f.read()) print(f.tell()) # 52 光标的位置 f.seek(0) # 将光标移到最前面 print(f.tell()) # 0
这个时候,文件已经建立,如果文件不存在,那么
r和w 表示只读和只写 文件存在的情况下,写入会覆盖掉原先的内容 with open("demo.txt", 'r', encoding='utf-8') as f: print(f.tell()) print(f.read()) # w只写, 文件已经存在,会覆盖掉原先的内容,如果文件不存在,就会创建一个文件 with open("demo.txt", "w", encoding="utf-8") as f: f.write("中国加油") with open("demo2.txt", 'w', encoding='utf-8') as f: f.write("hello world!!!")
4. 非文本内容的基本操作,rb和wb
rb和wb 非文本的只读和只写 li = "" with open("函数内循环.png", "rb") as f: # 这本身就是二进制的,所以不用指定编码格式 # 二进制我们一般不会打印出来,而是用一个变量来接收,存起来 li = f.read() # 将这个变量写入到一个新的图片文件里面 with open("test.png", "wb") as f: f.write(li)
5. a 追加模式
如果文件原本就存在,就在原本的文件的末尾加入内容,如果文件不存在,那么创建新文件,并写入内容
a 追加 with open("demo.txt", "r", encoding="utf-8") as f: print(f.read()) with open("demo.txt", "a", encoding="utf-8") as f: f.write(" 将军百战死") with open("demo.txt", "r", encoding="utf-8") as f: print(f.read())
6. r+ w+ a+
r+ w+ a+ """ r+: 读写,指针在文件开头 w+: 读写,文件存在的话,那么写入内容,如果文件不存在,那么创建文件新文件,写入内容 a+: 读写,文件存在的话,则在文件末尾追加,如果文件不存在,那么创建新文件,并写入内容 """ with open("demo2.txt", "r+", encoding="utf-8") as f: f.write(" hello world!!! come on!!!") print(f.read()) print(f.tell()) with open("demo3.txt", "w+", encoding="utf-8") as f: f.write(" 你好世界") print(f.read()) with open("demo1.txt", "a+", encoding="utf-8") as f: f.write(" 中国你好") print(f.read())