风云编程python基础语法(6)
目录
十五、编码与文件
编码
二进制
编码表
encode和decode
文件读写
读取文件
写入文件
小结
练习
统计成绩
默写古诗
十六、模块
什么是模块
使用自己的模块
import语句
from...import语句
if__name__=='__main__'
使用他人的模块
初探借用模块
如何自学模块
学习csv模块
总结
练习
时间管理器-time模块
又来默写古诗词-os模块
十五、编码与文件
编码
二进制
bit位/比特:存放一位二进制数,即0或1,,最小的存储单位。
byte字节:8个二进制位为一个字节(B),最常用的单位。
1B(byte )= 8 bit
1KB (kilobyte )= 1024B
1MB (Megabyte)= 1024KB
1GB (Gigabyte)= 1024MB
编码表
编码表:计算机世界的字典
8进制是用0,1,2,3,4,5,6,7
16进制是用0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
几种编码方案在当前的使用情况:
0)计算机是有自己的工作区的,这个工作区被称为“内存”。数据在内存当中处理时,使用的格式是Unicode,统一标准。在Python3当中,程序处理我们输入的字符串,是默认使用Unicode编码的,所以你什么语言都可以输入。
1)数据在硬盘上存储,或者是在网络上传输时,用的是UTF-8,因为节省空间。但你不必操心如何转换UTF-8和Unicode,当我们点击保存的时候,程序已经自动帮我们做好了编码工作。
2)一些中文的文件和中文网站,还在使用GBK,和GB2312。
基于此,有时候面对不同编码的数据,我们要进行一些操作来实现转换。这里就涉及接下来要讲的【encode】和【decode】的用法。
encode和decode
用法:
‘你想编码的内容’.encode('你使用的编码表')
‘你想解码的内容’.decode('你使用的编码表')
print('吴枫'.encode('utf-8'))
print('吴枫'.encode('gbk'))
print(b'\xe5\x90\xb4\xe6\x9e\xab'.decode('utf-8'))
print(b'\xce\xe2\xb7\xe3'.decode('gbk'))#》》
b'\xe5\x90\xb4\xe6\x9e\xab'
b'\xce\xe2\xb7\xe3'
吴枫
吴枫
最前面b:代表它是bytes(字节)类型的数据。
编码的本质:把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据。
\x:分隔符,用来分隔一个字节和另一个字节。
你经常会看到网址里面有好多的%,它们也是分隔符,替换了Python中的\x。比如像下面这个:
https://www.baidu.com/s?wd=%E5%90%B4%E6%9E%AB
它的意思就是在百度里面,搜索“吴枫”,使用的是UTF-8编码。
\xe5\x90\xb4\xe6\x9e\xab # Python编码“吴枫”的结果
%E5%90%B4%E6%9E%AB # 网址里的“吴枫”
ASCII码
print('K'.encode('ASCII'))
#>>
b'K'
第一行的K | 第三行的K |
字符串 | bytes类型的数据 |
采用系统默认的Unicode编码 占两个字节 |
占一个字节 |
附一个彩蛋~
print(b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'.decode('utf-8'))
文件读写
读取文件
1、步骤:开——读——关
file1 = open('/Users/Ted/Desktop/test/abc.txt','r',encoding='utf-8')
filecontent = file1.read()
print(filecontent)
file1.close()
2、文件地址
要找到你的文件地址,只需要把你要打开的文件直接拖到编辑器终端的窗口里,就会显示出文件地址,这样获取的地址是绝对路径。
绝对路径 | 相对路径 |
最完整的路径 | 相对于当前文件夹的路径 |
要使用其他文件夹的文件 | 要打开的文件和open.py在同一个文件夹里 |
获取文件的相对路径还有个小窍门,用VS Code打开文件夹,在文件点击右键,选择:
windows系统中,常用\来表示绝对路径,/来表示相对路径。但\在Python中是转义字符,所以时常会有冲突。为了避坑,Windows的绝对路径通常要稍作处理,写成以下两种格式:
open('C:\\Users\\Ted\\Desktop\\test\\abc.txt') #将'\'替换成'\\'open(r'C:\Users\Ted\Desktop\test\abc.txt') #在路径前加上字母r
写入文件
开——写——关
file1 = open(r'd:\1python\python小课作业代码\test\123.txt','a',encoding='utf-8')
file1.write('\nhzy\n')
file1.write('zyl\n')
file1.close()
小结
注意:
1)想写入的数据不是文本内容,而是音频和图片(是以二进制的形式保存)的话,可以用'wb'的模式,它的意思是以二进制的方式打开一个文件用于写入。
2)with open... as
为了避免打开文件后忘记关闭,占用资源或当不能确定关闭文件的恰当时机的时候,我们可以用到关键字with。
# 普通写法
file1 = open('abc.txt','a')
file1.write('张无忌')
file1.close()# 使用with关键字的写法
with open('abc.txt','a') as file1:
#with open('文件地址','读写模式') as 变量名:#格式:冒号不能丢file1.write('张无忌') #格式:对文件的操作要缩进#格式:无需用close()关闭
练习
统计成绩
统计四个学生的作业总得分
罗恩 23 35 44
哈利 60 77 68 88 90
赫敏 97 99 89 91 95 90
马尔福 100 85 90
file1 = open(r'd:\1python\python小课作业代码\第三阶段\scores.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
print(file_lines)
# ['罗恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 90\n', '马尔福 100 85 90']for i in file_lines:print(i)
#罗恩 23 35 44
#哈利 60 77 68 88 90
#赫敏 97 99 89 91 95 90
#马尔福 100 85 90final_scores = []for i in file_lines:data = i.split()sum=0for score in data[1:]:sum = sum + int(score)result = data[0]+str(sum)print(result)
# 罗恩102
# 哈利383
# 赫敏561
# 马尔福275final_scores.append(result)winner = open(r'd:\1python\python小课作业代码\第三阶段\winner.txt','w',encoding='utf-8')
winner.writelines(final_scores)
winner.close()
# 罗恩102哈利383赫敏561马尔福275
readlines():按行读取
split():按空格把字符串里面的内容分开
join():把字符串合并的
用法:str.join(sequence),str代表在这些字符串之中,你要用什么字符串连接
a=['c','a','t']
b=''
print(b.join(a))
c='-'
print(c.join(a))
# cat
# c-a-t
最后三行代码:
打开一个叫winner.txt的文件。(如果电脑中不存在winner.txt的话,这行代码会帮你自动新建一个空白的winner.txt
以writelines()的方式写进去,为什么不能用write()?因为final_scores是一个列表,而write()的参数必须是一个字符串,而writelines()可以是序列,所以我们使用writelines()。
关闭文件,记得不要把括号丢掉就好。
默写古诗
原文
锦瑟
[唐] 李商隐
锦瑟无端五十弦,
一弦一柱思华年。
庄生晓梦迷蝴蝶,
望帝春心托杜鹃。
沧海月明珠有泪,
蓝田日暖玉生烟。
此情可待成追忆,
只是当时已惘然。
老师想让学生默写的
锦瑟
[唐] 李商隐
锦瑟⽆端五⼗弦,
____________。
庄⽣晓梦迷蝴蝶,
望帝春⼼托杜鹃。
沧海⽉明珠有泪,
蓝⽥⽇暖⽟⽣烟。
此情可待成追忆,
____________。
代码参考
list_test = ['一弦一柱思华年。\n','只是当时已惘然。\n']
# with open ('poem.txt','r') as f:# 会报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 14: illegal multibyte sequence# 原因:txt是utf-8编码,所以编码需要转为utf-8
with open ('poem.txt','r',encoding='utf-8') as f:lines = f.readlines()
print(lines)
with open ('poem.txt','w',encoding='utf-8') as new:for line in lines:if line in list_test:new.write('_______________。\n')else:new.write(line)
注意:如果最后一句“只是当时已惘然”在list_test中如果写了\n,对应的poem.txt文件里 “只是当时已惘然。”之后还需要回车一次,否则这句无法识别。
十六、模块
什么是模块
模块是最高级别的程序组织单元(模块什么都能封装)
封装模块的目的也是为了把程序代码和数据存放起来以便再次利用。如果封装成类和函数,主要还是便于自己调用,但封装了模块,我们不仅能自己使用,文件的方式也很容易共享给其他人使用。 每一个单独的py文件,本质上都是一个模块。
使用自己的模块
import语句
a = '我是模块中的变量a'def hi():a = '我是函数里的变量a'print('函数“hi”已经运行!')class Go1: # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省a = '我是类1中的变量a'@classmethoddef do1(cls):print('函数“do1”已经运行!')class Go2:a = '我是类2中的变量a'def do2(self):print('函数“do2”已经运行!')print(a) # 打印变量“a”hi() # 调用函数“hi”print(Go1.a) # 打印类属性“a”
Go1.do1() # 调用类方法“Go1”A = Go2() # 实例化“Go2”类
print(A.a) # 打印实例属性“a”
A.do2() # 调用实例方法“do2”
这段代码中基本上展现了所有的调用方式。
现在我们要做的是把这段代码拆分成两个模块,把封装好的变量、函数、类,放到test.py文件中,把执行相关的语句放到main.py文件中。请注意main.py中的注释。
a = '我是模块中的变量a'
def hi():a = '我是函数里的变量a'print('函数“hi”已经运行!')
class Go1: # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省a = '我是类1中的变量a'@classmethoddef do1(cls):print('函数“do1”已经运行!')
class Go2:a = '我是类2中的变量a'def do2(self):print('函数“do2”已经运行!')
import test # 导入test模块print(test.a) # 使用“模块.变量”调用模块中的变量test.hi() # 使用“模块.函数()”调用模块中的函数print(test.Go1.a) # 使用“模块.类.变量”调用模块中的类属性
test.Go1.do1() # 使用“模块.类.函数()”调用模块中的类方法A = test.Go2() # 使用“变量 = 模块.类()”实例化模块中的类
print(A.a) # 实例化后,不再需要“模块.”
A.do2() # 实例化后,不再需要“模块.”
import语句还有一种用法是import…as…。比如我们觉得import story太长,就可以用import story as s语句,意思是为“story”取个别名为“s”。
from...import语句
格式:from 模块名 import 指定模块中的变量名/函数名/类名
效果:1.导入模块中的指定部分 2.导入后的指定部分可直接使用,无需加上“模块.”前缀
注意:
1. 当我们需要从模块中指定所有内容直接使用时,可以写成【from xx模块 import *】的形式,*代表“模块中所有的变量、函数、类”。
一般情况下,我们不要为了图方便直接使用【from xx模块 import *】的形式。这是因为,模块.xx的调用形式能通过阅读代码一眼看出是在调用模块中的变量/函数/方法,而去掉模块.后代码就不是那么直观了。
2. 如果想要导入只打印类属性,可以
from 模块 import 类名
print(类名.类属性名)
if__name__=='__main__'
在Python中,当我们在运行某一个py文件,就能启动程序 ——— 这个py文件就是程序的运行入口。当我们有了一大堆py文件组成一个程序的时候,为了【指明】某个py文件是程序的运行入口,我们可以在该py文件中写出这样的代码
# 【文件:xx.py】
代码块 1……if __name__ == '__main__':代码块 2……
作用:
1.当xx.py文件被直接运行时,代码块2将被运行;
2.当xx.py文件作为模块是被其他程序导入时,代码块2不被运行。
使用他人的模块
初探借用模块
可以用命令random.__file__找出random模块的文件路径,就可以去打开查看它的源代码。
结构大致为导入其他模块-变量-random类-各种函数...
如何自学模块
百度该模块,自己做案例笔记。
import random # 调用random模块a = random.random() # 随机从0-1之间抽取一个小数
print(a)a = random.randint(0,100) # 随机从0-100之间抽取一个数字
print(a)a = random.choice('abcdefg') # 随机从字符串/列表/字典等对象中抽取一个元素(可能会重复)
print(a)a = random.sample('abcdefg', 3) # 随机从字符串/列表/字典等对象中抽取多个不重复的元素
print(a)items = [1, 2, 3, 4, 5, 6] # “随机洗牌”,比如打乱列表
random.shuffle(items)
print(items)
还可以使用dir()函数查看一个模块,看看它里面有什么变量、函数、类、类方法。
学习csv模块
csv是一种文件格式,你可以把它理解成“简易版excel”。
中文教程:https://yiyibooks.cn/xx/python_352/library/csv.html#module-csv
可以直接看实例学习
如果出现Python 读取csv报错编码问题 : UnicodeDecodeError: 'utf-8' codec can't decode byte 0x87 in position 10: invalid start byte
可以参考:https://www.cnblogs.com/whm1012/p/10569749.html
import csv#读取(按行)
with open('data.csv','a',newline='') as f:write = csv.writer(f)write.writerow([2333,826])#写入(按行)
with open('data.csv',newline='') as f:reader = csv.reader(f)for row in reader:print(row)
总结
练习
时间管理器-time模块
请你通过搜索和自学,了解并运用下面两个新知识:
time模块中的时间戳(可进行日期运算);
格式化日期(可将日期转换成平常我们所见的格式);
倒计时的功能怎么用print()函数实现。
import time
input('欢迎使用时间管理器!请按回车继续。')#设置任务和时间
while True:task_name = input('请输入任务名:')task_time = int(input('你觉得自己至少可以专注这个任务多少分钟?输入N分钟'))input('此次任务信息:\n我要完成的任务:%s\n我至少要专注:%d分钟\n按回车开始计时'%(task_name,task_time))start = time.time()start_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())# time.time() 返回当前时间的时间戳# time.localtime() 返回值time.struct_time(tm_year=2021, tm_mon=8, tm_mday=26, tm_hour=18, tm_min=30, tm_sec=52, tm_wday=3, tm_yday=238, tm_isdst=0)# time.strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间.此处表示年-月-日 时-分-秒 如2021-08-26 18:33:15#显示倒计时for t in range(task_time*60,0,-1):info = '请专注任务,还要保持专注 ' + str(t) + ' 秒哦!'print(info,end="")print("\b"*(len(info)*2),end="",flush=True)time.sleep(1)print('你已经专注了 %d 分钟,很棒~再加把劲,完成任务!'%task_time) #\b 将光标从当前位置向左移动一个字符(遇到\n或\r则停止移动),并从此位置开始输出后面的字符(空字符\0和换行符\n除外)#举例:【替换功能】如果后面加了k个\b,m个空格,也就是将原字符串从最后一个向前走k步,之后将后面m个位置替换成空格#打印len(info)*2次。#*2的原因:我们用的字符串是中文,而1个中文字符 = 2个英文字符(占位)#flush=True 开启缓存区,可以屏幕上实时更新打印的内容 #原理:print() 函数会把内容放到内存中, 内存中的内容并不一定能够及时刷新显示到屏幕中(应该是要满足某个条件,这个条件现在还不清楚)。 使用flush=True之后,会在print结束之后,不管你有没有达到条件,立即将内存中的东西显示到屏幕上,清空缓存。 #保存记录到timelog.txt文件中,询问是否继续task_status = input('请在任务完成后按输入y:')if task_status == 'y':end = time.time()end_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))actual_time = int((end-start)/60)start_end = start_time + '———' + end_time + '\n'with open('timelog.txt','a',encoding='utf-8') as f:f.write(task_name + ' 的预计时长为:' + str(task_time) + '分钟\n')f.write(task_name + ' 的实际时长为:' + str(actual_time) + '分钟,具体时间为:' + start_end)again = input('建立一个新任务请按 y, 退出时间日志记录器请按 q:')if again == 'q':breakelse:print('抱歉,你的输入有误。请重启时间记录器。')print('愿被你善待的时光,予你美好的回赠。')
又来默写古诗词-os模块
参考代码:
os.replace(file1,file2), 这个函数相当于用file2 给 file1 重命名,并删除file2
import os
list_test = ['一弦一柱思华年。\n','只是当时已惘然。\n']with open ('poem.txt','r',encoding='utf-8') as f:lines = f.readlines()with open ('poem.txt','w',encoding='utf-8') as new:for line in lines:if line in list_test:new.write('_______________。\n')else:new.write(line)os.replace('poem.txt','poem_new.txt')
拓展:
os.getcwd() # 返回当前工作目录
os.listdir(path) # 返回path指定的文件夹包含的文件或文件夹的名字的列表
os.mkdir(path) # 创建文件夹
os.path.abspath(path) # 返回绝对路径
os.path.basename(path) # 返回文件名
os.path.isfile(path) # 判断路径是否为文件
os.path.isdir(path) # 判断路径是否为目录
注: dir为单词directory(目录)的缩写。
风云编程python基础语法(6)相关推荐
- 风云编程python基础语法(8)|| 完结
目录 十八.思维课-用编程能力解决实际问题 流程图 产品设计 如何提需求 如何设计解决方案 练习 (1)"不知道吃什么" (2)滚动的广告牌 十九. 目标 阶段1.0:输入固定 ...
- 风云编程python基础语法(3)
目录 九.编程学习的两大瓶颈 1.知识学完就忘 2.缺乏解题能力 练习:九九乘法表 十.函数 1.函数的定义 2.定义和调用函数 3.参数的类型 4.return语句 5.变量作用域 练 ...
- 风云编程python基础语法(1)
未完待续,持续更新中... 99**2 = 99^2 一.print()函数 二.数据类型 三.条件判断 四.input()函数 五.列表和字典+元组 列表list 1.格式:roommates=[' ...
- 风云编程python基础语法(5)
目录 十四.角色属性克制 目标 版本1.0:类的封装,打包函数 版本2.0:类的继承和实例化,让三种角色属性不同 版本3.0:为类添加克制关系的类方法 版本4.0:角色类型之间的配合 版本5.0:优化 ...
- 风云编程python基础语法(7)
目录 十七.发邮件 目标 版本1.0:发一封最简单的邮件 smtplib模块 email模块 代码结构 可能出现的错误 版本2.0:给自己发完整的邮件 丰富邮件头 丰富正文内容 版本3.0:群发一封完 ...
- 风云编程python基础语法(2)
目录 八.人机小游戏 1.明确项目目标 2.分解过程,拆解项目 3.逐步执行,代码实现 1.0 版本+计时器time.sleep(sec) 2.0版本+随机生成random.randint(a,b) ...
- 风变编程python助教_花30天时间,学完了风变编程Python基础语法课
原标题:花30天时间,学完了风变编程Python基础语法课 20节实打实的课程,1个月时间,我终于学完了风变编程的Python基础语法课.刚开始学的时候,就有人问我感受怎么样,当时本着未知全貌不予置评 ...
- 风变python基础语法_风变编程python (基础语法爬虫精进)
温馨提示:本信息由[会员:crm010com]搜集整理发布,版权归原作者及发布者所有,您如有异议请 举报 或者 版权申诉. 风变编程python (基础语法爬虫精进) 第1章介绍在计算机中安装Pyth ...
- 风变编程python课_花30天时间,学完了风变编程Python基础语法课
原标题:花30天时间,学完了风变编程Python基础语法课 20节实打实的课程,1个月时间,我终于学完了风变编程的Python基础语法课.刚开始学的时候,就有人问我感受怎么样,当时本着未知全貌不予置评 ...
最新文章
- CQOI2015 任务查询系统
- c++十六进制加法_C++中输出十六进制形式的字符串
- oracle物理备份与恢复,Oracle 备份与恢复概念原理学习
- 好大一盘棋:谷歌光纤再下一城
- 开发函数计算的正确姿势——OCR 服务
- 【InfoQ大咖说直播回放】老司机聊程序员的职场道路选择
- vue响应的res.data和res.data.data
- Spring 3.1缓存和@Cacheable
- QT+VS中ui不能声明为指针?
- 上古卷轴5json文件修改_捏脸工具-RaceMenu
- 抖音ai智能机器人挂机_抖音上最火的人工智能机器人--LUKA绘本阅读机器人
- 【MQTT编程】Last will and Testament(LWT Payload设置)
- java写快递柜管理系统
- 2021芒部中学高考成绩查询,2021年镇雄县高考状元名单资料,今年镇雄县高考状元多少分...
- 苹果电脑怎么更换计算机模式,图文详解苹果电脑如何切换成windows系统
- 2021年5月—系统集成项目管理工程师—上午综合知识(51-60)
- 开源php官方团队解散,php语言大厦将倾?
- AVI音视频封装格式学习(四)——linux系统C语言AVI格式音视频封装应用
- 现代笑话二则 :1.同居女友;2.无语的司机。
- Cocos2dx 之 cocosbuilder的使用