python基础之文件基本操作

ε祈祈猫儿з 提交于 2020-01-30 21:09:27

代码的存储可以通过定义变量来存储,但是变量存储代码,这只能存在内存中,一旦关闭,原先的代码就会消失,所以我们需要把代码通过文件的形式,永久将代码保存在硬盘中,所以需要学会文件的基本操作。

文件的只读和只写模式分别为r和w

1. 先建立一个文件demo1.txt , 并写入内容

查看demo1文件中的内容

# 我们在桌面上操作文件:1.打开文件;2.读取文件; 3.关闭文件
f = open("demo1.txt", "r", encoding="utf-8")# f = open(r"C:\Users\dyl\Desktop\demo3.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可以传入字符串,也可以传入字符序列,但是不能传入数字,每个元素之间如果要换行,就需要用\n换行符,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\n", "World\n", "Fuiture\n"])
# 刷新缓存区,保存内容
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'\n\xe6\xbb\xa1\xe5\x9f\x8e\xe5\xb0\xbd\xe5\xb8\xa6\xe9\xbb\x84\xe9\x87\x91\xe7\x94\xb2\xef\xbc\x8c\xe4\xb8\x8d\xe7\xa0\xb4\xe6\xa5\xbc\xe5\x85\xb0\xe7\xbb\x88\xe4\xb8\x8d\xe8\xbf\x98\xe3\x80\x82\n'
# 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("\n将军百战死")

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("\nhello world!!!   come on!!!")
    print(f.read())
    print(f.tell())

with open("demo3.txt", "w+", encoding="utf-8") as f:
    f.write("\n你好世界")
    print(f.read())

with open("demo1.txt", "a+", encoding="utf-8") as f:
    f.write("\n中国你好")
    print(f.read())

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!