目录

十五、编码与文件

编码

二进制

编码表

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)相关推荐

  1. 风云编程python基础语法(8)|| 完结

    目录 十八.思维课-用编程能力解决实际问题 流程图​ 产品设计 如何提需求 如何设计解决方案 练习 (1)"不知道吃什么" (2)滚动的广告牌 十九. 目标 ​阶段1.0:输入固定 ...

  2. 风云编程python基础语法(3)

    目录​​​​​​​ 九.编程学习的两大瓶颈 1.知识学完就忘 2.缺乏解题能力 练习:九九乘法表 十.函数 1.函数的定义 2.定义和调用函数 3.参数的类型 4.return语句 5.变量作用域 练 ...

  3. 风云编程python基础语法(1)

    未完待续,持续更新中... 99**2 = 99^2 一.print()函数 二.数据类型 三.条件判断 四.input()函数 五.列表和字典+元组 列表list 1.格式:roommates=[' ...

  4. 风云编程python基础语法(5)

    目录 十四.角色属性克制 目标 版本1.0:类的封装,打包函数 版本2.0:类的继承和实例化,让三种角色属性不同 版本3.0:为类添加克制关系的类方法 版本4.0:角色类型之间的配合 版本5.0:优化 ...

  5. 风云编程python基础语法(7)

    目录 十七.发邮件 目标 版本1.0:发一封最简单的邮件 smtplib模块 email模块 代码结构 可能出现的错误 版本2.0:给自己发完整的邮件 丰富邮件头 丰富正文内容 版本3.0:群发一封完 ...

  6. 风云编程python基础语法(2)

    目录 八.人机小游戏 1.明确项目目标 2.分解过程,拆解项目 3.逐步执行,代码实现 1.0 版本+计时器time.sleep(sec) 2.0版本+随机生成random.randint(a,b) ...

  7. 风变编程python助教_花30天时间,学完了风变编程Python基础语法课

    原标题:花30天时间,学完了风变编程Python基础语法课 20节实打实的课程,1个月时间,我终于学完了风变编程的Python基础语法课.刚开始学的时候,就有人问我感受怎么样,当时本着未知全貌不予置评 ...

  8. 风变python基础语法_风变编程python (基础语法爬虫精进)

    温馨提示:本信息由[会员:crm010com]搜集整理发布,版权归原作者及发布者所有,您如有异议请 举报 或者 版权申诉. 风变编程python (基础语法爬虫精进) 第1章介绍在计算机中安装Pyth ...

  9. 风变编程python课_花30天时间,学完了风变编程Python基础语法课

    原标题:花30天时间,学完了风变编程Python基础语法课 20节实打实的课程,1个月时间,我终于学完了风变编程的Python基础语法课.刚开始学的时候,就有人问我感受怎么样,当时本着未知全貌不予置评 ...

最新文章

  1. CQOI2015 任务查询系统
  2. c++十六进制加法_C++中输出十六进制形式的字符串
  3. oracle物理备份与恢复,Oracle 备份与恢复概念原理学习
  4. 好大一盘棋:谷歌光纤再下一城
  5. 开发函数计算的正确姿势——OCR 服务
  6. 【InfoQ大咖说直播回放】老司机聊程序员的职场道路选择
  7. vue响应的res.data和res.data.data
  8. Spring 3.1缓存和@Cacheable
  9. QT+VS中ui不能声明为指针?
  10. 上古卷轴5json文件修改_捏脸工具-RaceMenu
  11. 抖音ai智能机器人挂机_抖音上最火的人工智能机器人--LUKA绘本阅读机器人
  12. 【MQTT编程】Last will and Testament(LWT Payload设置)
  13. java写快递柜管理系统
  14. 2021芒部中学高考成绩查询,2021年镇雄县高考状元名单资料,今年镇雄县高考状元多少分...
  15. 苹果电脑怎么更换计算机模式,图文详解苹果电脑如何切换成windows系统
  16. 2021年5月—系统集成项目管理工程师—上午综合知识(51-60)
  17. 开源php官方团队解散,php语言大厦将倾?
  18. AVI音视频封装格式学习(四)——linux系统C语言AVI格式音视频封装应用
  19. 现代笑话二则 :1.同居女友;2.无语的司机。
  20. Cocos2dx 之 cocosbuilder的使用

热门文章

  1. 异构信息网络 Heterogeneous information network (HIN)
  2. 计算机电路基础第二版张虹,第1章节电路的基本概念与剖析方法——第1讲.ppt
  3. Linux下更新git(亲测有效)
  4. python-用IDLE运行程序
  5. 通过internet连接到股票信息服务器,一种股票机的制作方法
  6. oppo A57(全网通)一键救砖,轻松刷回官方系统。
  7. 无符号整数与有符号整数相加问题
  8. 个人简介个人自我介绍PPT模板
  9. [IMWeb训练营]-团队作业
  10. matlab巴特沃斯滤波器用法