python基础语法day10
一、二分法
二分法叫二分查找;
作用:从某个有序容器中一半一半的取元素,最终获取到目标值
限制: 所查找容器必须事先排好序
list1 = [0, 5, 10, 60, 90]
# list1 = [70]
target = 70
left = 0
right = len(list1) - 1
while left <= right:
mid = (left + right) // 2
if list1[mid] == target:
print(mid)
break
elif list1[mid] > target:
right = mid - 1
else:
left = mid + 1
else:
print('未找到')
- 时间复杂度:程序执行时花费时间
- 空间复杂度:程序执行时花费的内存
- 时间复杂度和空间复杂度是保持平衡的。
二分法的变形:容器元素先升序再降序
二、数据持久化
- 数据持久化:将数据从瞬时状态转换为持久状态
对象:文本文件和表格文件
- python操作文件
操作文本文件:新建(重命名) -> 打开 -> 写数据 ->保存关闭
打开 -> 读数据 -> 关闭
表格文件(excel):新建 -> 打开 -> 写数据 -> 保存、关闭、重命名
打开 -> 读数据 -> 关闭
- 文件操作形式
以读写形式操作文件
- r:只读,文件不存在,报错
- w:只写,文件不存在,先创建;如果文件存在,先清空
- a:追加,文件不存在,先创建;文件存在,继续添加内容
以字符串、二进制数据类型操作文件
- t:字符串形式(如果选t,可以不写,r等价于rt、tr)
- b:二进制形式,一般计算机中存储的数据都是以二进制形式存在(图片、视频、音频等)
- 文件操作形式应该怎么使用
‘rt’,‘rb’,‘tr’,'br’等
三、文件读操作
open(文件路径,文件操作模式,编码方式,换行方式)
文件路径:包含文件名,一般写相对路径
文件操作模式:‘rt’,‘rb’,‘tr’,'br’等
编码方式:encoding = ‘utf-8’,或encoding = ‘gbk’
换行方式:newline = ‘’(读操作不需要指定)
- windows:\r\n;mac:\r;linux:\n;
- 补充:\r将鼠标光标移动到下一行行首。
- 文件路径
绝对路径:一个文件存放在那个磁盘下的什么文件夹(D:\user\word\test.txt)
相对路径:以当前文件为参照物,另一个文件相对于他的位置
.表示当前目录
…表示返回上一级
\文件夹和文件夹之间以及文件夹和文件之间间隔的符号
- 以文件对象的形式打开已存在文件
# file = open(r'test.txt', 'r', encoding='utf-8')
file = open(r'test.txt', 'r', encoding='gbk')
print(file)
- 读操作:read、readline、readlines
-
read:一次性将文件中内容以字符串的形式全部读
result = file.read() print(result,type(result))
-
readline:每次只读一行,结果为字符串类型
result1 = file.readline() result2 = file.readline() result3 = file.readline() result4 = file.readline() print(result1, result2, result3, result4)
-
readlines:一次性将所有行读出来,结果为列表,每一行是列表中的每个元素
result5 = file.readlines() print(result5)
- 关闭文件
file.close()
四、文件写操作
open(文件路径,文件操作模式,编码方式,换行方式)
文件路径:包含文件名,一般写相对路径
文件操作模式:‘rt’,‘rb’,‘tr’,'br’等
编码方式:encoding = ‘utf-8’,或encoding = ‘gbk’
换行方式:newline = ‘’(读操作不需要指定)
file = open('古诗.txt', 'w', encoding='utf-8', newline='')
- 写操作:write
str1 = '静夜思\n唐 李白\n床前明月光\n疑是地上霜\n'
file.write(str1)
file.close()
file = open('古诗.txt', 'a', encoding='utf-8', newline='')
# write:向文件写入内容
str1 = '举头望明月\n低头思故乡'
file.write(str1)
file.close()
- 读操作和写操作编码要保持一致
file = open('古诗.txt', 'r', encoding='utf-8')
# file = open('古诗.txt', 'r', encoding='gbk')
print(file.read())
file.close()
# file.read() # ValueError: I/O operation on closed file.
# I/O --> Input/Out
五、with用法
-
with:预定义的清理操作
-
只要退出了with的缩进,直接执行清理操作,将文件关掉。
with open('古诗.txt', 'r', encoding='utf-8') as file:
result = file.read()
print(result)
# print(file.read())
六、eval方法
eval:将字符串序列化,eval中必须写长度非0的字符串
with open('eval测试.txt', 'w', encoding='utf-8') as file:
file.write('1\n')
list1 = [1, 2, 3, 4, 5]
file.write(f'{list1}')
with open('eval测试.txt', 'r', encoding='utf-8') as file:
result1 = file.readline()
print(result1, type(result1))
print(file.readline())
print(eval('1') + 2)
print('[1,2,3,4,5]'[0])
print(eval('[1,2,3,4,5]')[0])
# print(eval('abcd'))
# print(eval(''))
七、python读写图片、视频
- 将图片二进制读出来
file = open('photo1.jpg', 'rb')
result = file.read()
file.close()
# b'xxxxxx' 二进制字节码
- 将图片二进制数据写回去
file = open('photo2.jpg', 'wb')
file.write(result)
file.close()
八、csv文件
- csv.writer(打开的文件)
- CSV文件中的数据是以表格形式展示,但是其中的原理是文本文件的原理。
- 列表中的一个元素代表一个单元格的内容
2.csv.writers(打开的文件)
- writerow() - 单行写入,writerow中传递一个列表,列表表示一行,
- 列表中的一个元素代表一个单元格的内容
import csv
csvfile = open('学生成绩.csv', 'w', encoding='utf-8', newline='')
# 使用CSV模块提供的writer方法进行文件写操作
myWrite = csv.writer(csvfile)
myWrite.writerow(['编号', '姓名', '年龄', '专业'])
# writerow() - 单行写入,writerow中传递一个列表,列表表示一行,
# 列表中的一个元素代表一个单元格的内容
myWrite.writerows(
[
['python001', '张三', '18', '计算机科学与技术'],
['python001', '张三', '18', '计算机科学与技术'],
['python001', '张三', '18', '计算机科学与技术']
]
)
csvfile.close()
file = open('学生成绩.csv','r',encoding='utf-8')
data = csv.reader(file)
for i in data:
print(i)
file.close()
九、csv表格添加一列计算的平均分
import csv
# 读酒店文件
file = open('北京高档酒店价格分析.csv', 'r', encoding='utf-8')
# 可迭代对象
data = csv.reader(file)
dataList = [i for i in data]
# for i in data:
# print(i)
file.close()
# 计算结果并写回文件
file_1 = open('北京高档酒店价格分析.csv', 'w', encoding='utf-8', newline='')
myWrite = csv.writer(file_1)
# # for i in range(1,len(dataList)):
dataList[0].append('平均评分')
myWrite.writerow(dataList[0])
for i in dataList[1:]:
sumScroe = 0
for index in range(3, 7):
# 计算总分
sumScroe += float(i[index])
AvgScroe = round(sumScroe / 4, 1)
print(i[0], AvgScroe)
# -----
i.append(AvgScroe)
myWrite.writerow(i)
file_1.close()
print('写入完成')
十、csv写读操作
- writeheader():将fieldnames对应的参数以列名的形式写入表格
- writerow():单行写入,以字典的形式单行写入
- writerows():多行写入,以列表的形式写入,列表中的元素为字典,一个字典代表一行
- csv.DictReader()结果为可迭代器对象
import csv
with open('王者荣耀装备.csv', 'w', encoding='utf-8', newline='') as f:
myWriter = csv.DictWriter(f, fieldnames=['类型', '名称', '价格'])
# writeheader():将fieldnames对应的参数以列名的形式写入表格
myWriter.writeheader()
# writerow():单行写入,以字典的形式单行写入
myWriter.writerow({'类型': '法师', '名称': '吸血书', '价格': 1880})
# writerows():多行写入,以列表的形式写入,列表中的元素为字典,一个字典代表一行
myWriter.writerows(
[
{'类型': '打野', '名称': '打野刀', '价格': 250},
{'类型': '游走', '名称': '学识之石', '价格': 250},
{'类型': '移动', '名称': '冷静之靴', '价格': 770}
]
)
print('写入完成')
# CSV读方法
with open('王者荣耀装备.csv', 'r', encoding='utf-8') as f:
# csv.DictReader()结果为可迭代器对象
result = csv.DictReader(f)
for i in result:
print(i, type(i))