【Python 文件操作&函数 05】
一、文件操作
1、打开文件
f = open(r'/Users/wufq/Desktop/userinfo.txt', mode='r', encoding='UTF-8')
注意:r'/Users/w这里的r是取消所有转移符转义的意思,mode=r r是读,w是写,encoding='UTF-8'是编写格式
2、读文件
f是一个文件句柄,所有和文件相关的操作都要依赖f,也可以叫做文件操作符
1、read()一次性读所有
2、readline() 一次读一行
print(f.read())
print(f.readline())
3、for循环读
for line in f: line=line.strip() #去掉所有空白 if line:print(line) #if判断后面只有一句的话,可以直接写到后面
4、关闭文件 -->打开一个文件必须的关闭释放资源
f.close()
5、写文件 -->写文件
f = open(r'/Users/wufq/Desktop/userinfo.txt', mode='w', # 已写的方式打开一个已经存在的文件,相当于清空一个文件 # 已写的方式打开一个不存在的文件,相当于新建一个空文件 encoding='UTF-8') f.write('张三|1234\n') f.write('李四|12346') f.close()
如果写入多个内容,默认是不会换行的,可以用\n来换行
mode='w' 会存在一个问题,就是每次执行的话就会清空文件,如何才能不清空而直接在后面进行追加呢
mode ='a' 就可以直接追加。(a是append的意思)
6、参数的介绍 -->已字节进行打开文件,并读、写;图片和视频文件如果要出来IDE话,是不能通过制定编码的形式打开的,mode='rd'是已字节形式读文件,mode=‘wb’是已字节形式写文件 ;read()表示读取所有,
read(n) n表示n个字节 -->图片和视频的这个n表示的是字节,文件的read(n)表示的是字符,比如:a表示一个字符占一个字节,“你”表示一个字符但是占3个字节
# 读取视频流,然后复制 import os # 获取视频流文件大小 size = os.path.getsize('/Users/wufq/PycharmProjects/pythonProject1/py27/day02/python.avi') file1 = open(r'/Users/wufq/PycharmProjects/pythonProject1/py27/day02/python.avi',mode='rb') file2 = open(r'/Users/wufq/PycharmProjects/pythonProject1/py27/day02/python_bak.avi',mode='wb') while size>1024: context = file1.read(1024) #已1024个字节读取 file2.write(context) size -=1024 else: context = file1.read(size) file2.write(context) file1.close() file2.close()
以with open() as f 的形式编写:
import os # 获取视频流文件大小 size = os.path.getsize('/Users/wufq/PycharmProjects/pythonProject1/py27/day02/python.avi') with open(r'/Users/wufq/PycharmProjects/pythonProject1/py27/day02/python.avi',mode='rb') as file1,\ open(r'/Users/wufq/PycharmProjects/pythonProject1/py27/day02/python_bak1.avi', mode='wb') as file2 : while size>1024: context = file1.read(1024) #已1024个字节读取 file2.write(context) size -=1024 else: context = file1.read(size) file2.write(context) file1.close() file2.close()
7、修改文件
删除文件 os.remove('文件路径')
修改文件 os.rename('源名','目的名')
注意:文件的修改和重命名一定在文件关闭状态下才能修改
二、函数
1、定义 def 函数名():
2、调用 直接用函数名调用
3、返回值
lst=[1,3,2,5] def mylen(): return len(lst) #如果想要函数有返回值,必须要用return返回 print(mylen())
- return 后,函数就结束了,return后面的代码就不会被执行了
- 不写return,所有代码执行完毕自动结束,返回值为none
- 只写return,遇到return程序接受,返回值none
- 写return 结果 ,程序结束,返回结果,如果是return 结果1,结果2,结果3,结果会被变成元组返回给调用者
4、参数
# 站在形参定义的角度上 #name,score位置参数,总是写在形参的最开始 #gender默认参数(关键字参数)总是写在位置参数之后的 def students(name,score,gender='女'): print('学习Python的同学%s,性别%s,成绩%s'%(name,score,gender)) students('张三',0) students('李四',1) students('赵武',1,'男')
name,score就是位置参数,gender是默认的参数一定是在后面的
|-- 动态传参数一:*args *args其实传的是一个元组
def welcome(*args): print(len(args)) print(type(args)) print(args) # 1、传入多个参数 welcome(1,2,3,4,5) ''' 执行结果: 5 <class 'tuple'> (1, 2, 3, 4, 5) 从执行结果的类型看,*args参数其实是tuple(元组) ''' # 2、传入元组 tt = (5,6,7,8,9) welcome(tt) ''' 直接传入元组名,执行结果: 1 <class 'tuple'> ((5, 6, 7, 8, 9),) 从执行结果看,虽然传入的仍然是一个元组,但是长度和结果都不准确了 ''' # 如何传元组,只需要在元祖名前加一个* welcome(*tt) ''' 执行结果: 5 <class 'tuple'> (5, 6, 7, 8, 9) 执行结果是准确的,*的作用去掉元组的小括号(提取tt元组中的数据,已元组方式调用函数) '''
*args动态参数放在位置参数之后
|-- 动态参数二:**kwargs 放在最后 **kwargs可以接受任意多个key value关键字的参数(如:a=1,b=2 字典{'a'=12,'b'=13})
# 1、传入普通的k=v的关键字参数 def kk(**kwargs): print(kwargs) kk(a=1,b='kk') #{'a': 1, 'b': 'kk'} # 2、传入k=v的字典 dd = {'name':'丽颖','age':30} # 不能直接传字典名,否则报 "kk(dd) # 不能直接传字典名,否则报" kk(dd) # 如何传字典,只需要在字典名前面加两个**, 此时的**表示将字典转换成key value的关键字参数 kk(**dd) # 执行结果:{'name': '丽颖', 'age': 30}
总结:各类参数放的位置:位置参数,*args,默认参数,**kwargs
|-- 把列表拆开传入
def pp(a,b,c): print(a) print(b) print(c) lst_00 =[1,2,3] res_00=pp(*lst_00) print(res_00)
5、函数进阶:命令空间和作用域
高阶函数
global和nonlocal