1.不一样编码之间的二进制是不能互相识别的。
2.对于文件的存储,及传输 不能是unicode的编码。python
bytes:内部编码格式(非unicode) str:内部编码格式(unicode)
#1. 打开文件,获得文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 经过句柄对文件进行操做 data=f.read() #3. 关闭文件 f.close()
打开一个文件包含两部分资源:操做系统级打开的文件+应用程序的变量。在操做完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:linux
f.close() #回收操做系统级打开的文件
f=open(...)是由操做系统打开文件,那么若是咱们没有为open指定编码,那么打开文件的默认编码很明显是操做系统说了算了,操做系统会用本身的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。vim
#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开 f=open('a.txt','r',encoding='utf-8')
#1. 打开文件的模式有(默认为文本模式): r ,只读模式[默认模式,文件必须存在,不存在则抛出异常] w,只写模式[不可读;不存在则建立;存在则清空内容] a, 只追加写模式[不可读;不存在则建立;存在则只追加内容] #2. 对于非文本文件,咱们只能使用b模式,"b"表示以字节的方式操做(而全部文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也须要提供字节类型,不能指定编码 #3,‘+’模式(就是增长了一个功能) r+, 读写[可读,可写] w+,写读[可写,可读] a+, 写读[可写,可读] #4,以bytes类型操做的读写,写读,写读模式 r+b, 读写[可读,可写] w+b,写读[可写,可读] a+b, 写读[可写,可读]
1. 文件打开方式为文本模式时,表明读取3个字符
2. 文件打开方式为b模式时,表明读取3个字节windows
其他的文件内光标移动都是以字节为单位的如:seek,tell,truncate 注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但不管哪一种模式,都是以bytes为单位移动的
2. truncate是截断文件,因此文件的打开方式必须可写,可是不能用w或w+等方式打开,由于那样直接清空文件了,因此truncate要在r+或a或a+等模式下测试效果。编辑器
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 flush(self, *args, **kwargs): # real signature unknown 刷新文件内部缓冲区 pass
with open("userinfo",encoding="utf-8",mode="r") as f: for line in f:
文件的数据是存放于硬盘上的,于是只存在覆盖、不存在修改这么一说,咱们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容所有加载到内存,在内存中是能够修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)函数
import os # 调用系统模块 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #所有读入内存,若是文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') #删除原文件 os.rename('.a.txt.swap','a.txt') #将新建的文件重命名为原文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提升应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,好比print(),len()等。但你也能够本身建立函数,这被叫作用户自定义函数。测试
第一个函数:编码
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函数调用 mylen()
格式:操作系统
定义:def 关键词开头,空格以后接函数名称和圆括号(),最后还有一个":"。 def 是固定的,不能变,他就是定义函数的关键字。 空格 为了将def关键字和函数名分开,必须空(四声),固然你能够空2格、3格或者你想空多少都行,但正常人仍是空1格。 函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名能够随便起,但咱们给函数起名字仍是要尽可能简短,并能表达函数功能 括号:是必须加的,先别问为啥要有括号,总之加上括号就对了! 注释:每个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以加强代码的可读性。 调用:就是 函数名() 要记得加上括号
我们用len()方法时,获得的结果会赋值给一个变量,而后获得结果:指针
str_len = len('hello,world') print(str_len)
可是我们写的这个函数,并不会获得这样的结果,如何让他和len函数同样,有返回值呢?
那就是在函数的最后加上一个return,return 后面写你须要的返回值就能够了。
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函数调用 str_len = mylen() print('str_len : %s'%str_len)
不写return的状况下,会默认返回一个None。
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函数调用 str_len = mylen() #由于没有返回值,此时的str_len为None print('str_len : %s'%str_len)
def ret_demo(): print(111) return #只写return print(222) ret = ret_demo() print(ret)
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函数调用 str_len = mylen() print('str_len : %s'%str_len)
def ret_demo1(): '''返回多个值''' return 1,2,3,4 def ret_demo2(): '''返回多个任意类型的值''' return 1,['a','b'],3,4 #返回多个值 ret1 = ret_demo1() print(ret1) ret2 = ret_demo2() print(ret2)
实参和形参
实参,*在执行的时候表明打散
1.位置参数,按照顺序一一对应
2.关键字参数,不用按照顺序,一一对应
3.混合参数(包括关键字参数,和位置参数),关键字参数的位置必须在位置参数的后边,一一对应
形参
1.位置参数,按照顺序
2.默认参数,默认参数必须在位置参数的后边
3.动态参数,又叫万能参数,*在函数定义的时候聚合
*args:接收的全部位置参数,放到一个元组里 **kwargs:接收的全部关键字参数,放到一个字典里
形参的顺序:位置参数--->args--->默认参数---->*kargs