讲讲昨天
s = 'abdf$'
s1 = s[:]
print(id(s),id(s1)) #运行结果:2429113184696 2429113184696
#切片的浅拷贝在这里不适用,和小数据池没关系
深浅拷贝的一个特殊例子
li = [{'1':[1]}]
l2 = li.copy()
l2[0]['1'].append(2)
print(li)
print(l2)
#字典的值是列表,这个列表是第二层,copy管不了这么深,
#运行结果
# [{'1': [1, 2]}]
# [{'1': [1, 2]}]
接下来,讲解文件操作,
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
pass
#源码讲解的东西太多,而且有些是太靠后的内容,暂时就不贴那么多了,
#首先是打开的文件在哪里,
#这里由于路径涉及\这个符号,即转义的问题,所以要记得r'C:\my.txt'和C:\\my.txt这两种形式,
# 相对绝对路径问题就pass了,
#**************************
#然后是encoding的问题,windows下默认以gbk的方式打开,linux下默认以utf-8的形式打开,
# 而对于以b方式打开的,就不需要指定encoding,b的形式主要是因为除了文字还有视频,图片等非文字格式,
#**************************
#对于mode,基本模式有r,w,a,
#在此基础上还有b,+,
#组合效果有r+,w+,a+,r+a,w+a,
#如果你弄不清组合情况之间的区别,去看看内部教材95页第一个问题,
#暂时就举一个r+的例子,
f = open("./boy", encoding="utf-8", mode="r+") #文件里面内容是AAAAAAAAAAAA
f.write('BBB') #按理说,r+是不能先写的,我们就是要先write,看会出什么错,
content = f.read()
print(content) #打印结果是AAAAAAAAA,比之前A的数量少了3个A,
# f.write('aaa')
f.close() #关闭文件之后,文件内的内容是BBBAAAAAAAAA,相当于前3个A都被替换为了B,
#打开之后,就该读取文件的内容了,
read(),是一次读取整个文件,坏处就是如果文件特别大,你的内存可能不够,
readline(),一次读取文件一行的内容,
readlines(),将文件内容读取进列表,列表中的每个元素存储一行内容,
read(n),还可以设定读取的数量,如果是b模式,这里n的单位就是字节,如果非b的模式,这里n的单位就是字符,
for i in f:#这是第五种,
print(i.strip())
f.close()
#关于r+ 的二次解释
f = open("./boy", encoding="utf-8", mode="r+")
content = f.read(5) #文件内容大于5个字符,
print(content)
print(f.tell()) #此时的位置,还和前面的一致,是5
f.write('SSS') #此时write是从最后开始写,
print(f.tell()) #这时候的位置大概是字母SSS那,具体数值和你数的字符数不一样,可能是因为换行符的原因吧,
f.close()
w+有点鸡肋,因为首先就会清空原来的文件,这时你再读就是空,无意义,然后你就算读,也是你自己刚写入的内容。
a+的意义对于读来说没什么意义,因为直接就在最后,你读就是读空气;对于写还是有用的;
再讲几个其它的文件操作方法,
tell() #告诉当前位置,
seek() #设定光标位置
truncate() #截取一部分,然后扔掉,只能用在a模式。不设定,就从当前位置到最后全部删掉;设定的话,从开头到设定位置的保留。
writable() #判断文件是否可写
readable() #判断文件是否可读
使用with的方式操作文件,1自动关闭文件,2可以同时操作多个文件,
# 1,将原文件读取到内存。
# 2,在内存中进行修改,形成新的内容。
# 3,将新的字符串写入新文件。
# 4,将原文件删除。
# 5,将新文件重命名成原文件。
import os
with open('log',encoding='utf-8') as f1,\
open('log.bak',encoding='utf-8',mode='w') as f2:
content = f1.read()
new_content = content.replace('alex','SB')
f2.write(new_content)
os.remove('log')
os.rename('log.bak','log')
import os
with open('log',encoding='utf-8') as f1,\
open('log.bak',encoding='utf-8',mode='w') as f2:
for i in f1:
new_i = i.replace('SB','alex')
f2.write(new_i)
os.remove('log')
os.rename('log.bak','log')
补充:
1.注意使用in use mode of b,中文不同编码占用字节数是不同的,如果移动文件光标注意弄清,
2.读写操作公用一个光标,
3.重点操作,r,r+,w,a,