Python基础10—Python操作文件及深浅拷贝(2022年)

本文详细介绍了Python中文件操作的不同模式(r, w, x, a及+),包括读写功能、文件操作的高级功能如seek和flush,并展示了如何循环读取文件以及深浅拷贝的区别。


1. 文件操作的操作模式

操作模式有四种方式:

  • r ,只读模式【默认】
  • w,只写模式【不可读;不存在则创建;存在则清空内容;】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【不可读; 不存在则创建;存在则只追加内容;】
# 只读模式,r
a = open("name.txt","r")   #打开文件,赋予只读的权限
ret = a.read()        #读取文件
a.close()            #退出文件
print(ret)             #打印文件内容

# 只写模式,w, 如果不存在会创建文件,存在则清空内容
a = open("name.txt","w")
a.write("Py小白雨\n")
a.close()

# 只写模式,x, 如果不存在会创建文件,存在则报错
a = open("name.txt","x")
a.write("Py小白雨\n")
a.close()

# 追加模式,a,不可读,不存在则创建文件,存在则会追加内容
a = open("name.txt","a")
a.write("Py小白雨\n")
a.close()

“+” 表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】
#"+"表示具有读写的功能

# r+,读写(可读,可写)
a = open("name.txt","r+",encoding="utf-8")
print(a.tell())    #打开文件后观看指针位置在第几位,默认在起始位置
date = a.read()       #第一次读取,指针读取到最后了,(可以加读取的索引位置,3表示只看前三位)
print(date)
a.write("Py小白雨\n")      #写的时候会把指针调到最后去写
a.seek(0)           #把指针放在第一位进行第二次读取
date = a.read()       #第二次读取
print(date)
a.close()

# w+,写读,(可写,可读),先清空内容,在写之后需要把指针放在第一位才能读
a = open("name.txt","w+",encoding="utf-8")
a.write("Py小白雨\n")        #清空内容写入
a.seek(0)                 #把指针放在第一位
date = a.read()           #进行读取
a.close()                 #退出文件
print(date)

# x+,写读,(可写,可读),需要创建一个新文件,文件存在会报错,在写之后需要把指针放在第一位才能读
a = open("name.txt","x+",encoding="utf-8")
a.write("Py小白雨\n")        #清空内容写入
a.seek(0)                 #把指针放在第一位
date = a.read()           #进行读取
a.close()                 #退出文件
print(date)

# a+,写读,(可写,可读),打开文件的同时,指针已经在最后了
a = open("name.txt","a+",encoding="utf-8")
date = a.read()          #第一次读,没数据,因为指针在最后
a.write("Py小白雨\n")          #往最后写入 张
a.seek(0)                #把指针放在第一位,让他进行读取
a.close()

"b"表示以字节的方式操作

  • rb 或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

# "b"表示处理二进制文件
# 只读模式,rb,以字节方式打开,默认打开是字节的方式
a = open("name.txt","rb")    #二进制方式读取2.log文件
date = a.read()            #定义变量,读文件
a.close()                  #关闭文件
print(date)                #打印文件
str_data = str(date, encoding="utf-8")    #字节转换成utf-8
print(str_data)            # 打印文件

# 只写模式,wb
a = open("name.txt","wb")     #打开文件2.log,可写的模式
date = "Py小白雨\n"             #定义字符串
a.write(bytes(date , encoding="utf-8")) #转换成字节,方便计算机识别
a.close()                    #关闭文件
print(date)                  #打印出来

# 只写模式,xb,
a = open("name.txt","xb")
date = "Py小白雨\n"   #字符串形式会报错,计算机不识别,得转换成字节
a.write(bytes(date,encoding="utf-8"))
a.close()
print(date)

# 追加模式,ab,
a = open("name.txt","ab")
date = "Py小白雨\n"
a.write(bytes(date,encoding="utf-8"))
a.close()
print(date)

2. 文件操作的其它功能

def fileno(self, *args, **kwargs): # real signature unknown
        #返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到

    def flush(self, *args, **kwargs): # real signature unknown
        #把文件从内存buffer里强制刷新到硬盘

    def readable(self, *args, **kwargs): # real signature unknown
        #判断是否可读

    def readline(self, *args, **kwargs): # real signature unknown
        #只读一行,遇到\r or \n为止

    def seek(self, *args, **kwargs): # real signature unknown
        #把操作文件的光标移到指定位置
        #*注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。
    def seekable(self, *args, **kwargs): # real signature unknown
        #判断文件是否可进行seek操作

    def tell(self, *args, **kwargs): # real signature unknown
        #返回当前文件操作光标位置 

    def truncate(self, *args, **kwargs): # real signature unknown
        #按指定长度截断文件
        #*指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。
        
    def writable(self, *args, **kwargs): # real signature unknown
        #判断文件是否可写

3. 文件操作之循环读取文件

f = open(file="name.txt",mode='r')
for line in f:
    line = line.split()
    name,addr = line
    print(name,addr)
f.close()

4. 深浅拷贝

浅拷贝

user = {
    "name":"Py小白雨",
    "age":18,
    "advantage":{
        "优势一":"唱跳",
        "优势二":"rap",
        "优势三":"篮球",
    }
}
d2 = user.copy()
user["age"] = 20
user["advantage"]["优势三"] = "打篮球"  
print(d2)
print(user)
# {'name': 'Py小白雨', 'age': 18, 'advantage': {'优势一': '唱跳', '优势二': 'rap', '优势三': '打篮球'}}
# {'name': 'Py小白雨', 'age': 20, 'advantage': {'优势一': '唱跳', '优势二': 'rap', '优势三': '打篮球'}}

浅copy会仅复制dict的第一层数据,更深层的advantage下面的值依然是共享一份。

深copy

import copy
user = {
    "name":"Py小白雨",
    "age":18,
    "advantage":{
        "优势一":"唱跳",
        "优势二":"rap",
        "优势三":"篮球",
    }
}
d2 = copy.deepcopy(user)
user["age"] = 20
user["advantage"]["优势三"] = "打篮球"
print(d2)
print(user)
# {'name': 'Py小白雨', 'age': 18, 'advantage': {'优势一': '唱跳', '优势二': 'rap', '优势三': '篮球'}}
# {'name': 'Py小白雨', 'age': 20, 'advantage': {'优势一': '唱跳', '优势二': 'rap', '优势三': '打篮球'}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值