April 29th_day12_file_operation

record

1.函数作为变量

实参高阶函数、返回值高阶函数
列表.sort(), sorted(), max(), min()函数中key参数
key要求:一个函数、有一个参数、有一个返回值

2.迭代器和生成器

迭代器:将其他序列转化成迭代器、生成器
获取元素:next(),for-in

# 迭代器
iter1 = iter('hello')
print(next(iter))
print(iter.__next__())

for x in iter1:
    print(x)

生成器:调用带有yield关键字的函数,就可以得到一个生成器
一个生成器能够产生多少数据,看函数执行完成会遇到多少次yield

# 生成器
def func1(num, pre=''):
    width = len(str(num))
    for x in range(1, num+1):
        yield pre.str(x).zfill(width)

gen_id = func1(100)
print(next(id_gen))
print(next(id_gen))

gen_id2 = func1(50,'python1902')
print(next(id_gen2))

# 每次都会创建新的生成器,获取第一个元素
print('===:', next(func1(60)))
print('===:', next(func1(60)))

生成式

生成式本质还是生成器,只是写法更简洁

1.生成式的写法

1.1.语法:

(表达式 for 变量 in 序列)

1.2.展开:

def func():
for 变量 in 序列:
yield 表达式
func()

1.3.说明:

() - 固定写法
表达式 - 除了赋值语句以外的任何语句,比如:数据、变量、运算表达式、函数调用表达式等(这个表达式一般都和后面的变量有联系)

gen1 = (x for x in range(5))
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
# print(next(gen1))  # StopIteration
dict1 = {'a': 1, 'b': 2, 'c': 3}
gen2 = ((value, key)for key, value in dict1.items())

print(next(gen2))
print(dict(gen2))
"""
(1, 'a')
{2: 'b', 3: 'c'}
"""

练习:实现自己的dict函数,可以将序列转换成字典

2.第二种写法

2.1语法

(表达式 for 变量 in 序列 if 条件语句)

2.2.展开

def func():
for 变量 in 序列:
if 条件语句:
yield 表达式

gen = func()

3.补充:python的三目运算符

C语言 - 条件语句?值1:值2 (如果条件语句为真整个表达式的结果为值1,否则是值2)
python语言 - 值1 if 条件语句 else 值2 (如果条件语句为真整个表达式的结果为值1,否则是值2)

x = 3
a = 1 if x == 2 else 2
print(a)

file

1.数据持久化

程序中产生的数据默认是保存在内存中,程序结束数据会自动销毁。如果希望程序结束数据不销毁,那么需要对这个数据做数据持久化
数据持久化:将数据保存到文件中,然后将文件保存在磁盘/硬盘中

2.文件操作(对文件内容进行操作)

基本步骤:打开文件 -> 操作文件(读/改) -> 关闭文件(xx.close)

2.1.打开文件

open(file, mode='r', encoding=None) - 以指定的方式打开文件,并且返回文件对象
说明:
file - 字符传,文件路径,可以写绝对路径也可以写相对路径
绝对路径(一般不用) - 完整路径,例如:/Users/yanhan/Documents/python/April_qianfeng_study/April_28th_day11/python\ program/text.json
相对路径(需要先将文件保存在工程目录下)
./ - 代表当前目录
../ - 代表当前目录的上册目录
.../ - 代表当前目录的上册目录的上册目录
以此类推

open('./test.txt') # ./可以省略,等于open('test.txt')
open('./files/test2.txt')
open('../files/text2.txt')

mode - 字符串,文件的打开方式(决定打开文件后能够进行的操作,和操作方式)
'r' - 以只读的方式打开文件,读出来的数据是字符串
'w' - 以只写的方式打开文件,写入的数据是字符串
'rb'/'br' - 以只读的方式打开文件,读出来的数据是二进制数据
'wb'/'bw' - 以只写的方式打开文件,写入的数据是二进制数据
'a' - 以只写的方式打开文件,写入的数据是字符串

注意:如果是以读的方式打开文件,文件不存在会报错(FileNotFoundError)
如果以写的方式打开文件,文件不存在不会报错,并且会自动创建这个文件

encoding - 文本编码方式
'utf-8'(mac,linux默认) - 支持中文
'gbk'(windows默认) - 只支持英文
注意:只有文本文件才能设置encoding,二进制操作不能设置encoding

# f保存文件对象,只有打开文件才能得到文件对象
f = open('text.txt', 'w', encoding='utf-8')

2.2.操作文件

2.2.1.读操作

文件对象.read() - 返回文件中的内容

f = open('text.txt', 'w', encoding='utf-8')
f.write('累猴呀\n嘎嘎嘎')
f.close()

f2 = open('text.txt', 'r')
content = f2.read()  # 读所有
print(content)

f2.seek(0)  # 设置读写位置
print('====', f2.read())

f2.seek(0)
print('=====:', f2.readline().rstrip(), end='')
print('=====:', f2.readline())
"""
累猴呀
嘎嘎嘎
==== 累猴呀
嘎嘎嘎
=====: 累猴呀=====: 嘎嘎嘎
"""

读不到内容的时候返回空串

2.2.2.写操作

文件对象.write(内容) - 将内容写入指定文件中

3.字节类型(bytes)

3.1.数据来源:

3.1.1.将其他数据类型转换成bytes类型:

整型和字符串都可以转换成bytes

bytes(10)
bytes(10.2)  # 浮点型不能转换
bytes(True)
bytes('abc', encoding='utf-8')  # 字符串转化需要设置encoding
bytes('你好!'.encode())  # 字符串转换二进制方法

f3 = open('test.txt', 'wb')
f3.write('abc'.encode())

3.1.2.将bytes转字符串

b1 = '你好!'.encode()

str1 = str(b1, encoding='utf-8')
print('str1:', str1)
str2 = b1.decode(encoding='utf-8')
print('str2:', str1)

3.1.3.以'rb'/'br'的方式读文件(获取二进制)

3.二进制文件的读写

图片、视频、音频等都是二进制文件。这些文件只能以带'b'的方式打开然后操作

# 二进制读操作
image_f = open('file/luffy.jpeg', 'rb')
image_data = image_f.read()
print(type(image_date), image_data)

# 二进制写操作
n_f = open('new.jpeg', 'wb')
n_f.write(image_data)

# 下载网络图片
response = requests.get('https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=3611364264,2238752415&fm=58')
n_f2 = open('new2.jpeg', 'wb')
n_f2.write(response.content)

file2

1.打开文件

with open() as 文件对象:
文件的操作
(出了缩进就自动关闭文件)

2.数据持久化

练习:统计程序启动次数(将当前程序的启动次数打印出来)

json

1.什么是json数据

满足json格式要求的数据就是json数据;文件内容满足json格式要求,就是json文件

1.1.json格式要求

a.一个json中有且只有一个数据;
b.这个必须是json支持的数据类型的数据。

1.2.json支持的数据类型

数字类型(number) - 所有的数字(整数和小数),支持科学计数法
例如:10, -100, 12.32, 3e2
字符串(string) - 使用双引号引起来的字符集,支持转义字符
例如:"abc", "12山东黄金", "123\nabc", "\u4e00"
布尔值(boolean) - 只有true,false两个值
数组(array) - 相当于python中的列表,[12, "asd", true, [1, 123]]
字典(dictionary) - 相当于python中的字典,key必须为字符串
例如:{"name": "张三", "age": 23}
null - 相当于None,空值

2.python数据和json数据的相互转换

python中内置了一个json模块,用来支持json相关操作

2.1.json转python

json (转) python
数字 int/float
字符串 str, 有可能将双引号变成单引号
布尔 true,false->True,False
数组 list
字典 dict
null None

2.2.json.loads()

json.loads(字符串,encoding=编码方式) - 将json字符串转换成python对应的数据
注意:这的字符串要求字符串中的内容必须是json格式的数据(去掉字符串最外面的引号,本身就是一个json数据)

2.3.python转json

python (转) json
int/float 数字
bool 布尔,大写变小写
str 字符串,单引号变双引号
list/tuple 数组
dict 字典
None null

2.4.json.dumps()

json.dumps(数据) - 将python数据转换成json格式的字符串

你可能感兴趣的:(April 29th_day12_file_operation)