码迷,mamicode.com
首页 > 其他好文 > 详细

文件操作与函数(补)

时间:2021-01-14 10:56:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:生成式   扩展   用户输入   register   none   关键字   tip   知识点   x86   

上周内容回顾

  • 字符串的内置方法

    strip
    split
    replase
    format
    upper
    lower
    # 如果想查看更多的字符串方法,可以再pycharm中通过字符类型后面加‘.‘的方式查看
    str.自动调试可以调用的内置方法
    
  • 列表的内置方法

    append
    insert
    extend
    sort
    len
    
    
  • 字典的内置方法

    d[‘key‘]=‘value‘
    
  • 可变类型与不可变类型

    就看内存地址是否可变
    
  • 元组与集合

    元祖你可以看做不可改变元素的列表
    
    集只有在去重和做关系运算的时候可能会用到
    
  • 字符编码

    计算机中记录了人类的字符与01码的对应关系,作为一个参考标准
    ASCII	第一个编码表
    GBK		中国的编码表
    
    unicode	万国码
    utf8	存储使用编码
    
  • 文件操作

    with open(文件路劲,模式,编码)as 变量名:
    	代码模块
    
  • 绝对路劲与相对路径

    绝对路劲
    	相当于坐标信息,任何情况下都可以根据绝对路劲获取位置信息
    相对路劲
    	获取位置信息需要有一个参考信息
    
  • 字符的转义

    斜杠与一些字符具有特殊含义
    \n换行
    \t制表符
    
    用r‘\n\‘t
    
  • 作业讲解

    l = [‘jason‘, ‘tony‘, ‘jerry‘, ‘tom‘, ‘kevin‘]
    
    l = [‘jason‘, ‘tony‘, ‘jerry‘, ‘tom‘, ‘kevin‘]
    
    # 1.for循环
    # # 先定义一个空列表用来存储即将产生的新数据
    # new_l = []
    # # for循环l里面的每一个元素然后操作产生新数据
    # for name in l:
    #     # 转大写并存入列表中
    #     new_l.append(name.upper())
    # print(new_l)
    
    # 2.列表生成式
    # new_ll = [name + ‘NB‘ for name in l]
    # print(new_ll)
    #####################################################
    # 扩展练习
    l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
    # 需求:筛选出大于33的元素
    # 1.for循环
    # new_l1 = []
    # # for循环获取l1里面的每一个元素
    # for i in l1:
    #     # 判断元素是否大于33
    #     if i > 33:
    #         # 如果大于33则添加到新列表中
    #         new_l1.append(i)
    # print(new_l1)
    # 2.列表生成式
    new_l2 = [i for i in l1 if i > 33]
    print(new_l2)
    #####################################################
    

今日内容概要

  • 文件操作之读写模式
  • 文件操作之操作模式
  • 常见文件操作的方法
  • 文件的修改
  • 函数的概念
  • 函数的定义
  • 函数的重要参数

今日内容详细

文件操作之读写模式

r
	只读模式,只能读取内容,不能写入
w
	只写模式,只能写入内容,不能读取
a
	只追加模式,只能写入内容,并且不会删除原文件内容

只读模式r

1.文件路劲不存在,r模式会直接报错
with open(r‘b.txt‘,‘r‘,encoding=‘utf8‘) as f:
	pass
# pass补全语法结构但是本身没有任何含义
# 报错 [Errno 2] No such file or directory: ‘b.txt‘

2.文件路劲存在:打开改文件只支持读内容,不能写入
 with open(r‘b.txt‘,‘r‘,encoding=‘utf8‘) as f:
	print( f.read())
# 可以读取
	f.write(‘你好啊‘)
# 不能写入	not writable

只写模式w

1.文件路劲不存在:自动创建文件
 with open(r‘bb.txt‘, ‘w‘, encoding=‘utf8‘) as f:
    pass

2.文件路劲存在,格式化后开始写入内容
with open(r‘bb.txt‘,‘w‘, encoding=‘utf8‘) as f:
    f.write(‘jasonNB‘)

# 不支持读 not readable 只支持写
‘‘‘
会先清空内容,再写入内容
虽然w模式打开存在的文件会清空内容,
但是工作中我们主要是去创建新文件写入内容
‘‘‘

只追加模式a

1.文件路劲不存在,会自动创建文件
with open(r‘c.txt‘, ‘a‘, encoding=‘utf8‘) as f:
    pass
2.文件存在,不会清空内容,在文件末位追加新的内容
with open(r‘c.txt‘, ‘a‘, encoding=‘utf8‘) as f:
    print(f.read)
‘‘‘
可以写入,内容添加至末位,换行要使用\n
不可以读 not readable
‘‘‘

操作模式

t
	文本模式(文件默认就是t模式)
    rt
    	with open(r‘b.txt‘,‘rt‘,encoding=‘utf8‘) as f:
    wt
    	with open(r‘b.txt‘,‘wt‘,encoding=‘utf8‘) as f:
    at
    	with open(r‘b.txt‘,‘at‘,encoding=‘utf8‘) as f:
    1.该模式只能操作文本文件
    2.读写都是以字符串为单位
    3.都需要加encoding参数确认编码

b
	二进制模式
    rb
    	open(r‘b.txt‘,‘rt‘)
    wb
    	open(r‘b.txt‘,‘wt‘)
    ab
    	open(r‘b.txt‘,‘at‘)
    1.该模式可以操作任意类型的文件
    2.读写都是以bytes为单位
    3.一定不能加encoding参数
    
针对二进制模式 rb wb ab 与rt wt at一样

 with open(r‘a.txt‘, ‘rb‘) as f:
	res = f.read()
	print(type(res))  # <class ‘bytes‘>
	res1 = res.decode(‘utf8‘)
	print(type(res1))  # <class ‘str‘>

 with open(r‘b.txt‘, ‘wb‘) as f:
     f.write(‘大宝贝‘.encode(‘utf8‘))  
# 包含中文需要使用关键字encode
     f.write(b‘hello world‘)  
# 如果是纯英文 只需要在最前面加一个b即可


# 利用b模式完成文件的拷贝功能
# 先利用rb读取图片数据
with open(r‘111.jpg‘,‘rb‘) as f:
    data = f.read()
# 在利用wb写入到新文件
with open(r‘D:\333.jpg‘,‘wb‘) as f:
    f.write(data)

编码与解码

################################################
# 中文按照编码表翻译成数字之后的结果
res = b‘\xe5\x86\x8d\xe5\x9d\x9a\xe6\x8c\x81\xe5\x9b\x9b\xe5\xa4\xa9,\xe5\xb0\xb1\xe5\x8f\x88\xe5\x8f\xaf\xe4\xbb\xa5\xe6\x94\xbe\xe4\xb8\x89\xe5\xa4\xa9\xe5\x81\x87\xe4\xba\x86!‘
# 按照指定的编码翻译成人类的字符  >>>:解码 decode
print(res.decode(‘utf8‘))
# 按照指定的编码将人类的字符翻译成数字  >>>:编码 encode
res1 = ‘再坚持四天,就又可以放三天假了!‘
print(res1.encode(‘utf8‘))
#################################################

常见方法及策略

# with open(r‘a.txt‘,‘r‘,encoding=‘utf8‘) as f:
#     # print(f.read())  # 一次性将文件内容全部读取出来
#     # print(f.readable())  # 判断文件是否可读
#     # print(f.readlinwie())  # 一次只读文件一行内容
#     # print(f.readlines())  # 结果是列表 一个个的元素就是一行行内容
#
#     # print(f.read())  # 文件内是有一个光标的移动概念
#     # print(f.read())
#     # print(f.read())
#
#     # 试想如果文件特别大,直接全部读取出来会产生内存溢出(爆满)
#     ‘‘‘我们在读取文件内容的时候一般都是采用下列的方式一行行读取‘‘‘
#     for line in f:  # 确保内存中同一时间只会出现一行文件内容
#         print(line)

with open(r‘b.txt‘,‘w‘,encoding=‘utf8‘) as f:
    # print(f.write())  # 写内容
    # print(f.writable())  # 判断文件是否可写
    # print(f.writelines([‘jason\n‘,‘tony\n‘]))
    f.flush()  # 立刻将文件内容由内存保存到硬盘 相当于ctrl+s

文件修改

# 方式1(当文件过大的时候可能会造成内存溢出)
# 先以rt模式读取文件内容
# with open(r‘c.txt‘, ‘r‘, encoding=‘utf8‘) as f:
#     data = f.read()
# # 再以wt模式写入文件内容
# with open(r‘c.txt‘, ‘w‘, encoding=‘utf8‘) as f:
#     f.write(data.replace(‘jason‘, ‘tony‘))
# 方式2:
# 先创建一个新的文件,循环读取老文件内容修改并写入新文件
# 之后将老文件删除,将新文件名修改为老文件名
import os

with open(r‘c.txt‘, ‘r‘, encoding=‘utf8‘) as read_f,         open(r‘c.backend.txt‘, ‘w‘, encoding=‘utf8‘) as write_f:
    for line in read_f:
        write_f.write(line.replace(‘tony‘, ‘BigBaby‘))
# 删除c.txt
os.remove(r‘c.txt‘)
# 将c.backend.txt重命名为c.txt
os.rename(r‘c.backend.txt‘, r‘c.txt‘)

函数

函数就是工具,我们提前准备好工具后就可以反复使用

在我们写代码的时候也是如此,有时候需要反复放入执行某一段代码,并且在不同的地方,反复执行,提前准备一个工具加以辅助,这个辅助工具就是函数

# 准备工具
def auth_login():
    username = input(‘username>>>:‘).strip()
    password = input(‘password>>>:‘).strip()
    if username == ‘jason‘ and password == ‘123‘:
    	print(‘登陆成功‘)
    else:
        print(‘密码或用户错误,请重新输入‘)
# 使用工具      
auth_login()

函数语法

固定句式
def 函数名(参数1,参数2,。。。)
	 ‘‘‘函数的注释‘‘‘
    函数体代码
    return 函数的返回值
1.def(必须的)
	是定义函数的关键字
2.函数名(必须的)
	遵循变量名的命名规范
3.参数(可选的)
	在使用函数的时候还可以给函数内部传入外界数据
4.函数的注释(可选的)
	用来解释函数的具体功能及参数含义(类似于说明书)
5.函数体代码(必须的)
	其实就是函数真正的业务逻辑
6.return(可选的)
	执行完函数之后,还可以给调用函数的人返回一些数据

注意事项

###############################
1.函数必须先定义之后才能使用
auth_login()  
# 不能在函数定义之前使用
# 需要先准备工具(先定义)
def auth_login():
    username = input(‘username>>>:‘)
    password = input(‘password>>>:‘)
    if username == ‘jason‘ and password == ‘123‘:
        print(‘登录成功‘)
    else:
        print(‘登录失败‘)
# 使用工具(后使用)
auth_login()  # 使用函数的过程我们称之为"函数的调用"

2.函数在定义阶段只识别语法不执行函数体代码,只有在调用函数的时候才会执行
def index():
    sdasd
    print(‘from index‘)
###############################

函数的返回值

1.不写return默认返回None
	def index():
        print(‘from index‘)
    res = index()
2.写了return,后面跟上面就返回什么
	def index():
        print(‘from index‘)
        return 123
    res = index()
3.如果是多个元素会自动组织成元组返回
	def index():
        print(‘from index‘)
        return 123,11,22,33
    res = index()
# 函数体代码遇到return就会自动结束整个函数的运行(类似于break)

函数的参数

###########################################
我们在定义函数的时候括号内写的变量名称之为函数的形式参数
	简称为"形参"
我们在调用函数的时候括号内写的真实数据称之为函数的实际参数
	简称为"实参"
形参类似于变量名,实参类似于变量的值,在调用函数的时候会将实参赋值给形参
函数运行结束自动解除关系
def index(x, y):  # x,y形参
    """
    将1赋值给了形参x
    将2赋值给了形参y
    x = 1
    y = 2
    """
    if x > y:
        print(x)
    else:
        print(y)
index(1,2)  # 1,2实参
###########################################

函数的参数之位置参数

既直接在对应的位置输入参数
针对位置参数,有几个就传几个,多了不行少了也不行
传值的时候就是按照前后顺序给形参赋值

函数的参数之关键字参数

使用‘=‘指名道姓的给对应的形参传值
def index(x, y):
    print(x, y)
index(y=1, x=2)
# 1 2
# 全部按照关键字参数
index(1, y=2) 
# 1	2
# 位置参数 关键字参数

index(x=1,2)  
# SyntaxError:positional argument follows keyword argument
# 关键字参数必须写在位置参数的后面
index(11, x=2)  
# TypeError: index() got multiple values for argument ‘x‘
# 一个形参只能赋值一次

函数的参数之默认参数

在函数的定义阶段就已经给形参赋值,称之为默认参数
	1.用户不传该参数就用默认的
    2.用户传了就用传了的
 
def register(name, age, gender=‘male‘):
    print(‘%s:%s:%s‘ % (name, age, gender))
    
    
register(‘jason‘, 18)
register(‘tony‘, 32)
register(‘jerry‘, 44)
register(‘lili‘, 18, ‘female‘)

函数参数之可变长参数

 需求1:函数无论接收多少个位置参数都可以正常执行
 def index(a, *x):
     print(x)
# *在形参中会接收多余的位置参数并组织成元组的形式赋值给*后面的变量名
 index(1)  # ()
 index(1, 2)  # (2,)
 index(1, 2, 3, 4)  # (2, 3, 4)
 需求2:函数无论接收多少个关键字参数都可以正常执行
 def index(b, **y):
     print(y)
# **在形参中会接收多余的关键字参数并组织成字典的形式赋值给**后面的变量名,但是必须对b赋值
 index(b=1)  # {}
 index(b=1, a=2, z=3)  # {‘a‘: 2, ‘z‘: 3}
# 如何定义一个函数无论接收多少位置参数和关键字参数都可以运行???
def index(*x, **y):
    print(x, y)
index()  # () {}
index(1, 2, 3)  # (1, 2, 3) {}
index(x=1, y=2, z=3)  # () {‘x‘: 1, ‘y‘: 2, ‘z‘: 3}
index(1, 2, 3, x=1, y=2, z=3)  # (1, 2, 3) {‘x‘: 1, ‘y‘: 2, ‘z‘: 3}
"""
在形参中书写在*和**后面的变量名可以自定义
但是我们会墨守成规的使用下列的命名方式
    *args
    **kwargs
def func(*args, **kwargs):
    pass
"""

作业

1.今日笔记抄写(最好是用自己的话整理知识点)
2.循环获取用户输入存入文件并且每一次都换行
3.将拷贝数据的概念封装成函数,文件路径由用户自己编写


利用文件操作和函数完成用户的注册和登录功能(思考题)
1.注册功能封装成函数
	用户输入用户名和密码之后直接存入文件中
2.登录功能封装成函数
	获取用户数据然后利用文件操作读取文件数据比对
"""
先完成主要逻辑
之后再考虑封装
"""

文件操作与函数(补)

标签:生成式   扩展   用户输入   register   none   关键字   tip   知识点   x86   

原文地址:https://www.cnblogs.com/kailun-aixuexi/p/14271372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!