学习python第三天

时间:2021-02-12 20:52:11

一、文件处理

二、函数知识结构

三、初级函数

四、命名空间,作用域

 

 

一、文件处理

1.文件操作的过程:

1. 打开文件,得到文件句柄并赋值给一个变量

2. 通过句柄对文件进行操作

3. 关闭文件

实际操作:

1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r (一般选择字符集是根据,文件保存时的字符集而定的)

2. 通过句柄对文件进行操作
data=f.read()

3. 关闭文件
f.close()

注意:

一般打开文件时,会调用系统的文件资源以及内存中的变量资源,所以在执行完文件后一定要执行f.close()和del f,而且删除变量一定要在文件关闭之后执行,否则丢失变量会导致文件一直打开,白白占用系统的资源。

SO建议使用with上下文来处理文件,在with执行结束后,系统会自动回收打开的相应资源

with open('a.txt','w') as f:
pass

with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统决定,在windows下是gbk,在linux下是utf-8。更具需要改变打开文件的字符集防止乱码

 

在python2中的file与python3中的open()的用法是一至的。

 

 

2.打开文件的方式有哪些种

‘r’ 默认的方式,已读的方式打开文件

‘w’以写的方式,打开文件。在文件不存在时创建文件,但是在文件存在时,会覆盖文件中的内容

‘a’以写的方式,打开文件。在文件不存在时创建文件,在文件存在时,会追加到文件的末尾

 

3.打开非文本文件时的打开方式(用法同上述用法,不过想在打开的文件默认是以字节为单位,这样就可以使用类似.mp3,.gpt的文件了)

‘rb’ 

‘wb’

'ab'

 4.X代表可以写的方法

"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】


x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】

5.文件处理的使用方式

#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中

f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name

 

 

 

练习,利用b模式,编写一个cp工具,要求如下:

  1. 既可以拷贝文本又可以拷贝视频,图片等文件

  2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file

  提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数

import sys

source,dest=sys.argv[1],sys.argv[2]

if len(sys.argv) != 3:

  print("uasge bad"

  sys.exit()

with open(source,'rb') as read_f,open(dest,'wb') as wirte_f:

  for line in read_f: #在打开文件时已近将读完的值交给了read_f了,所以不用再read一次了

  wirte_f.write(line)

 

 

5.文件内光标移到

read(3)

在打开的是文本文件时,读取3个字符,当打开的文件模式为b时,代表读取3个字符

文件内光标移动用法有seek,tell,truncate

seek有三种模式:

0代表从文件开头时

1代表从当前位置开始

2 代表从文件末尾开始


with open('test.txt','rb') as f:
f.seek(0,2)#0表示从文件开头开始,2代表移动两个字符

truncate代表截取文件

 

 

6.文件修改

在修改文件时,我们理所当然的以为修改文件就是直接从硬盘中调取文件,直接修改。但其实是将文件调用到内存中修改后生成交换文件。删除硬盘上的老文件,替换新文件。

 

重点.在我们修改文件时要是有较大的文件会将内存沾满,so我们可以一行行的读

import os

with open('userout.txt','r') as f,open('a.txt','w') as a:

  for line in f:

  line=line.replace("a",'b')

  a.write(line)

os.remove('userout.txt')

os.rename('a.txt','userout.exe')

 

二、函数知识结构

#1、内置函数
为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()
ps:我们将会在最后详细介绍常用的内置函数。

#2、自定义函数
很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。

 

如何设置函数

#语法
def 函数名(参数1,参数2,参数3,...):
'''注释'''
函数体
return 返回的值

 

理论:

函数的使用原则是先定义后调用,函数在定义阶段,会检查函数体的语法问题。但不会出来逻辑上的问题;

定义函数一般有三中形式无参、有参、空函数,更具用户的需要制定。一般空函数用来 构造框架。函数五return

值时返回NONE,多个值时用,隔开。最后会以元组的形式展现

 

 

三、函数基础

调用函数的方法:

函数名()

 

 

参数的使用方式:

#1、位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值

#2、关键字参数:按照key=value的形式定义的实参
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值

#3、默认参数:形参在定义时就已经为其赋值
可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型


#4、可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs

===========*args===========
def foo(x,y,*args):
print(x,y)
print(args)
foo(1,2,3,4,5)

def foo(x,y,*args):
print(x,y)
print(args)
foo(1,2,*[3,4,5])


def foo(x,y,z):
print(x,y,z)
foo(*[1,2,3])

===========**kwargs===========
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,a=1,b=2,c=3)

def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,**{'a':1,'b':2,'c':3})


def foo(x,y,z):
print(x,y,z)
foo(**{'z':1,'x':2,'y':3})

===========*args+**kwargs===========

def foo(x,y):
print(x,y)

def wrapper(*args,**kwargs):
print('====>')
foo(*args,**kwargs)

#5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
可以保证,传入的参数中一定包含某些关键字
def foo(x,y,*args,a=1,b,**kwargs):
print(x,y)
print(args)
print(a)
print(b)
print(kwargs)

foo(1,2,3,4,5,b=3,c=4,d=5)
结果:
2
(3, 4, 5)
3
{'c': 4, 'd': 5}

 

四、名称空间和作用域

名称空间:存放名字的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

名称空间的加载顺序

#1、python解释器先启动,因而首先加载的是:内置名称空间

#2、执行test.py文件,然后以文件为基础,加载全局名称空间

#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

 名称空间的查找顺序与加载顺序刚好相反

1.函数内部定义

2.基于文件基础定义

3.python内置

作用域即范

- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有

- 局部范围(局部名称空间属于该范围):临时存活,局部有效

 

 

global和nonlocal关键字

global可以将函数中的自定义的变量定义为全局变量

nonlocal可以将嵌套函数中的上级函数中定义的变量申明到本层函数中使用