day8笔记整理
day8笔记总结
1.昨日内容回顾
2.join连接可迭代对象,生成字符串
3.文件操作一
1.昨日内容回顾:
1.数据类型的缺陷补充,元组,列表,字典,集合
元组只有单个元素,且没有逗号时,数据类型为改元素的数据类型,如果是可变的数据类型则可修改
解决方法:加逗号
列表,列表循环计算索引相关问题时,最好不要改变列表长度,会改变索引,影响结果或报错
解决方法,不用循环,切片一次删除,或者从后往前删除,不改变前面元素的索引,for i in range(len(li)-1,-1,-2)
字典和集合,字典和集合是无序的,迭代循环时不要改变长度,不然会影响结果或报错
字典的fromkeys()方法,dic1 = dict.fromkeys("可迭代对象",变量),可迭代对象分为字典的key,value指向同一内存地址,都等于变量
2.集合的增删查(没有索引,没有key值,没法修改)以及其他方法
增,add(),update()将可迭代对象添加到集合,类似列表的extend
删,remove()按元素删除,pop()随机删除,有返回值,clear()清空,del内存级别删除列表
查:for循环查询
其他方法:通用方法len()查询集合长度
frozenset(“可迭代对象”),set1 = frozenset(“可迭代对象”)将可迭代对象创建为集合,数据类型为不可变的frozenset类型,显示方式frozenset({1,2,3})
3.集合主要用于列表去重list1 = list(set(list1))和关系测试
集合关系
交集&,并集|,差集set1-set2,difference()方法,反交集^并集减去交集
子集issubset()方法,或<,超集issuperset()方法或者>,返回值为bool
4.=等号赋值与深浅copy
a=b=value,则a,b,指向相同内存地址,修改内存值时,保持一致性,更换不同内存地址,则不再相关
浅copy,切片属于浅copy
浅copy第一层指向不同的内存地址,第二层往下指向相同的内存地址,保持一致性
深copy,指向不同内存地址,两数据没有任何关系,深copy需要引入copy模块
import copy
set2 = copy.deepcopy(set1)
2.join不止用于将列表转化为字符串,所有可迭代对象都可以转化为字符串,但可迭代对象必须由字符串组成,字典只会将keys值连接为字符串
3.文件操作
文件操作首先要打开文件,获得文件句柄,并赋值给变量,对文件的操作通过文件句柄进行
三要素,path文件路径,编码规则,操作模式
打开方式1,file = open(“文件路径path”,encoding = “非unicode编码”,“mode模式”),用open打开,需要close语句关闭文件
用with打开(用with打开,短暂时间后会自动关闭文件(句柄),有延时,有时会在下面指令执行后才关闭,为避免互相影响,可以加上close语句)
打开单个文件
with open(“文件路径path”,encoding = “非unicode编码”,“mode模式”)as f:
pass
打开多个文件
with open(“文件路径path”,encoding = “非unicode编码”,“mode模式”)as f1,\
open(“文件路径path”,encoding = “非unicode编码”,“mode模式”)as f2:
pass
...打开多个文件进行操作
file为存放文件句柄的变量
open底层调用的是windows系统的open
windows默认编码规则是GBK,也就是说在linux,mac默认编码是utf-8
encoding:意为解码和编码时指定的编码规则,凡是带b的可以省略encoding = ,默认是”r“模式,只有r模式,mode可以省略不写
模式mode,r,w,a,b四大类
b模式是对字节码操作,不用encoding
r模式:r,rb,r+,r+b
r:只读模式,con = file.read()读取全部内容,文件太大时会爆内存
rb:以bytes方式读取
con = file.read(n),文本模式读取n的字符,bytes模式,读取n个字节
con = flie.readline(),读取当前行,不含换行符
con = file.readlines(),将读取每一行,将每一行(含换行符)存为列表的一个元素,存储在列表中
for循环是最好的
for i in 句柄或file.read(),i为文件的每一行,内存每次只读取一行字符,比readlines()方法更节省内存
r+:表示读写,先读后写,先对文件句柄操作读,再操作写
r+b:以字节码的方式,先读后写
w模式:w,wb,w+,w+b
w模式,只写模式,没有文件则新建,有则删除文件内容
wb模式,只写模式,只能写入二进制(通过encode()方法转化为二进制)
w+模式,先写后读模式
w+b,以字节码形式先写后读,
a模式
a模式,追加,没有文件则新建,有则追加
ab模式,以二进制方式追加字节码
a+模式,先追加内容,再读取内容
a+b,以字节码方式,先追加内容,再读取内容
文件常用操作方法文件(通过文件句柄操作)
f.read(n)读取,文本模式读取n个字符,b模式时读取n个字节,其余的文件内光标移动都是以字节为单位进行的,如seek,tell,truncate
seek的三种移动方式seek(offset,whence),offset光标的偏移量,代表需要移动便宜的字节数,whence可选,默认值为0,给offset一个定义,表示要从那个位置开始偏移,o代表从文件开头算起,1代表从当前位置开始算起,2代表从文件末尾算起
truncate()截断文件,文件的打开方式必须可写,但不能用w或w+等方式打开,因为那样会清空文件,所以truncate要在r+,或a或a+等模式下测试效果
f.close()关闭文件
f.tell()查询光标位置
f.flush()刷新文件内部缓冲区,强制保存
f.readable(),f.writeable()判断当前模式是否可读或可写,seekable()判断指针是否可操作
f.read(),f.write()读取写入内容
4.文件修改的五个步骤
1.读取文件内容
2.对读取的文件内容进行修改操作
3.将修改后的内容写入新的文件
4.删除原文件(调用os.remove(“原文件名”)
5.将新文件名改为原文件名(调用os.rename("新文件名“,”原文件名“))将新文件名改为源文件名
文件修改的两种方法,根据读取的不同,第一种将文件内容全部加载到内存,文件较小时可以,比较low
第二种,for循环遍历文件,将文件逐行读取到内存,修改完毕后逐行添加到新文件,最后用新文件覆盖源文件
具体实现过程中需要调用os
import os
with...
...
os.remove("原文件名")
os.rename("新文件名",”源文件名“)
补充1:英文字符(英文字母,数字和特殊字符),GBK和UFT-8可以直接转化,因为英文字符都是引用ASCII码,中文字符就不行
文件操作方法,方法详细内容如下:
def close(self, *args, **kwargs): # real signature unknown
关闭文件
pass
def fileno(self, *args, **kwargs): # real signature unknown
文件描述符
pass
def flush(self, *args, **kwargs): # real signature unknown
刷新文件内部缓冲区
pass
def isatty(self, *args, **kwargs): # real signature unknown
判断文件是否是同意tty设备
pass
def read(self, *args, **kwargs): # real signature unknown
读取指定字节数据
pass
def readable(self, *args, **kwargs): # real signature unknown
是否可读
pass
def readline(self, *args, **kwargs): # real signature unknown
仅读取一行数据
pass
def seek(self, *args, **kwargs): # real signature unknown
指定文件中指针位置
pass
def seekable(self, *args, **kwargs): # real signature unknown
指针是否可操作
pass
def tell(self, *args, **kwargs): # real signature unknown
获取指针位置
pass
def truncate(self, *args, **kwargs): # real signature unknown
截断数据,仅保留指定之前数据
pass
def writable(self, *args, **kwargs): # real signature unknown
是否可写
pass
def write(self, *args, **kwargs): # real signature unknown
写内容
pass
参考博客http://www.cnblogs.com/jin-xin/articles/8183203.html

浙公网安备 33010602011771号