日常中的数据存储在纸上, 而计算机的数据存储在哪里呢?
—硬盘上
默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。
文件可以存储数据。
这个得分成三步,第一步打开冰箱;第二步,把大象塞进冰箱里;第三步,把冰箱关上。在操作文件的整体过程与将大象放入冰箱的过程是很相似的。
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
open(文件名,访问模式) e.g. f = open('test.txt', 'w')
如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
要读取二进制文件,比如图片、视频等等,用’rb’, ‘wb’, 'ab’等模式打开文件即可.
运行:
结果:
seek(offset, from) 有2个参数: offset:偏移量 from:方向
0:表示文件开头;
1:表示当前位置;
2:表示文件末尾 (不常用)
1). 把位置设置为:从文件开头,偏移5个字节
2). 把位置设置为:文件最开始
3). 把位置设置为:文件最末尾
方法一: 调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,
并且操作系统同一时间能打开的文件数量也是有限的。
方法二: Python引入了with语句来自动帮我们调用close()方法。
输入文件的名字,然后程序自动完成对文件进行备份。
os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如 显示当前目录下所有文件 / 删除某个文件 /获取文件大小…
例如:
• os模块中的rename()可以完成对文件的重命名操作。
rename(需要修改的文件名, 新的文件名)
• os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)
def draw_code_image(str_code='A34G'):
# 引入绘图模块, Image表示画布对象; ImageDraw表示画笔对象; ImageFont表示字体对象;
from PIL import Image, ImageDraw, ImageFont
# 定义变量,用于画面的背景色、宽、高
# RGB:(255,0,0), (0, 255,0), (0, 0, 255)
bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
width = 100
height = 25
# 创建画布对象
im = Image.new('RGB', (width, height), bgcolor)
# 创建画笔对象
draw = ImageDraw.Draw(im)
# 调用画笔的point()函数绘制噪点
for i in range(100):
xy = (random.randrange(0, width), random.randrange(0, height))
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
draw.point(xy, fill=fill)
# 构造字体对象
font = ImageFont.truetype('/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc',
23)
# 构造字体颜色
fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
for index, item in enumerate(str_code):
# print(5 +index*20)) # (5,2) (25, 2), (45,2)
draw.text((5 + (index * 20), 2), item, font=font, fill=fontcolor)
return im
"""
import random
def generate_str_code(length=4):
"""随机生成验证码"""
import string
strings = string.ascii_letters + string.digits
return "".join(random.sample(strings, length))
def draw_code_image(str_code):
"""根据给丁的字符串验证码绘制验证码图片"""
# 引入绘图模块, Image表示画布对象; ImageDraw表示画笔对象; ImageFont表示字体对象;
from PIL import Image, ImageDraw, ImageFont
# 定义变量,用于画面的背景色、宽、高
# RGB:(255,0,0), (0, 255,0), (0, 0, 255)
width = 100
height = 25
white_color = (255, 255, 255)
black_color = (0, 0, 0, 0)
green_color = (0, 255, 0)
# 创建画布对象
im = Image.new('RGB', (width, height), white_color)
# 创建画笔对象
draw = ImageDraw.Draw(im)
# 调用画笔的point()函数绘制噪点
for i in range(100):
xy = (random.randrange(0, width), random.randrange(0, height))
draw.point(xy, fill=green_color)
# 构造字体对象 shell命令: fc-list :lang=zh
font = ImageFont.truetype('doc/wqy-zenhei.ttc', 23)
for index, item in enumerate(str_code):
# print(5 +index*20)) # (5,2) (25, 2), (45,2)
draw.text((5 + (index * 20), 2), item, font=font, fill=black_color)
return im
if __name__ == '__main__':
str_code = generate_str_code()
# 返回的图片对象
im = draw_code_image(str_code)
im.save('hello.png')
"""
项目需求: 批量验证码图片生成器
1). 可生成数字、大写、小写字母及三者混合类型的验证码
2). 支持自定义验证码字符数量
3). 支持自动调整验证码图片的大小
4). 支持自定义干扰点的数量
5). 支持自定义验证码图文颜色
"""
import os
import random
white_color = (255, 255, 255)
black_color = (0, 0, 0, 0)
green_color = (0, 255, 0)
def generate_str_code(length=4):
"""随机生成验证码"""
import string
strings = string.ascii_letters + string.digits
return "".join(random.sample(strings, length))
def draw_code_image(str_code, item_width=25, height=25, point_count=100,
bg_color=black_color, font_color=white_color):
"""
根据给定的字符串验证码绘制验证码图片
:param str_code:
:param item_width:
:param height:
:param point_count:
:param bg_color:
:param font_color:
:return:
"""
# 引入绘图模块, Image表示画布对象; ImageDraw表示画笔对象; ImageFont表示字体对象;
from PIL import Image, ImageDraw, ImageFont
# 定义变量,用于画面的背景色、宽、高
# RGB:(255,0,0), (0, 255,0), (0, 0, 255)
# 根据验证码的长度自动调整画布的宽度
width = len(str_code) * item_width
# 创建画布对象
im = Image.new('RGB', (width, height), bg_color)
# 创建画笔对象
draw = ImageDraw.Draw(im)
# 调用画笔的point()函数绘制噪点
for i in range(point_count):
xy = (random.randrange(0, width), random.randrange(0, height))
draw.point(xy, fill=green_color)
# 构造字体对象 shell命令: fc-list :lang=zh
font = ImageFont.truetype('doc/wqy-zenhei.ttc', 23)
for index, item in enumerate(str_code):
# print(5 +index*25)) # (5,2) (25, 2), (45,2)
draw.text((5 + (index * 25), 0), item, font=font, fill=font_color)
return im
if __name__ == '__main__':
from tqdm import tqdm
verifyCodeCount = 100
dirname = 'vCode'
for count in tqdm(range(verifyCodeCount)):
# He3x ===== He3x.png
str_code = generate_str_code(length=10)
# 返回的图片对象
im = draw_code_image(str_code)
# 生成图片文件的绝对路径
filename = os.path.join(dirname, str_code + random.choice(['.png', '.jpg']))
im.save(filename)
print("生成图片验证码成功")
# 作业: 将验证码目录中所有的.jpg图片转换格式未.png的图片.
# 考察: os模块的使用、PIL库
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;
pyhton中的集合不能转成json格式。
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
encoding="utf-8", default=None, sort_keys=False, **kw)
• ensure_ascii=False: 中文存储需要设定
• indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
• separators=(',',':'): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
• sort_keys=True: 字典排序
例如我们碰到集合对象, datetime对象,或者自定义的类对象等json默认不支持的数据类型时,我们就需
要自定义编解码函数。有两种方法来实现自定义编解码。
python的pickle模块实现了python的所有数据序列和反序列化。与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。cPickle是pickle模块的C语言编译版本相对速度更快。
1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象
网络传输,但不同版本的Python序列化可能还有差异。