python(文件)实例

纵然是瞬间 提交于 2019-12-21 10:50:41

01项目案例: 文件的备份Demo

在这里插入图片描述

02例:拷贝文件

在这里插入图片描述
在这里插入图片描述
运行:
在这里插入图片描述
结果:
在这里插入图片描述

02.1例:拷贝二进制文件(图片、音乐)如图片:

要读取二进制文件,比如图片、视频等等,用’rb’, ‘wb’, 'ab’等模式打开文件即可.

在这里插入图片描述
运行:
在这里插入图片描述
结果:
在这里插入图片描述

03例:

国内镜像:pip install -i https://pypi.douban.com/simple pillow

码前提要:
在这里插入图片描述
在这里插入图片描述
代码如下:

例: 验证码生成器

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("生成图片验证码成功")

结果:100条验证码
在这里插入图片描述
在这里插入图片描述

04例:文件批量重命名

  1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
  2. 将当前img目录所有以.png结尾的后缀名改为.jpg.
import random
import string
import os
from os.path import splitext

def gen_code(len=4):
    #随机生成4位验证码
    li = random.sample(string.ascii_letters+string.digits,len)
    #拼接为字符串
    return ''.join(li)

def create_files():
    #随机生成100个验证码
    li = [gen_code() for i in range(100)]
    os.mkdir('img')
    for i in li:
        os.mkdir('img/' + i + '.png')

create_files()

def modify_suffix(dirname,old_suffix,new_suffix):
    #找出以png结尾的文件名
    # filter()函数接收一个函数 f 和一个list,得出True的元素
    pngfile = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))

    #分离文件名和后缀
    # os.path.split(‘path’):按照路径将文件名和路径分割开 (2)os.path.splitext()将文件名和扩展名分开,得到一个2维列表
    basefiles = [os.path.splitext(filename)[0] for filename in pngfile]

    #文件重命名
    for filename in basefiles:
        # print(filename)
        oldname = os.path.join(dirname,filename + old_suffix)
        newname = os.path.join(dirname,filename + new_suffix)
        # 考虑过 oldname为什么不能直接用pngfile(列表)!类型不同
        os.rename(oldname,newname)
        print('%s重命名为%s成功' %(oldname,newname))

modify_suffix('img','.png','.jpg')

结果:
在这里插入图片描述

04.1批量修改文件名

在这里插入图片描述

05 读取一个文件,显示除了以井号(#)开头的行以外的所有行。

法一

filename = 'doc/passwd.bak'
with open(filename) as f:
    for line in f:
        if not line.startswith('#'):
            print(line)

法二

with open('doc/passwd.bak', "r") as file:
    for lines in file:
        if lines[0] != "#":
            print(lines, end="")

结果:
在这里插入图片描述

06 制作一个"密码薄",其可以存储一个网址(例如www.csdn.net),和一个密码(例如 123456),请编写程序完成这个“密码薄”的增删改查功能,并且实现文件存储功能。

import os
os.chdir("D:/")

def main():#定义主界面函数
    print('''
                      学生信息管理系统

          =============== 功能菜单 ===============        

      │   1 增加网址和密码                         │
      │   2.删除网址和密码                         │
      │   3.修改网址和密码                         │
      │   4.查询网址和密码                         │                             

      ''')

#main()

def add_book():
    f = open("book.txt",'w')
    web = input("请输入网址:")+'\n'
    password = input("请输入密码:")
    f.write(web)
    f.write(password)
    f.close()
#add_book()

def del_book():
    book = ""
    f = open("book.txt",'r')
    web = input("请输入网址:")
    password = input("请输入密码:")
    fr = f.read()
    f.close()
    #print(type(fr))
    if web in fr and password in fr:
        f1 = open("book.txt", 'w')
        f1.write(book)
        f1.close()
        print("删除成功")
    else:
        print("未找到对应网址或密码,请检查后重试")
#del_book()

def change_book():
    f = open("book.txt", 'r')
    web = input("请输入旧网址:")
    password = input("请输入旧密码:")
    fr = f.read()
    f.close()
    # print(type(fr))
    if web in fr and password in fr:
        f1 = open("book.txt", 'w')
        new_web = input("请输入新网址:") + '\n'
        new_password = input("请输入新密码:")
        f1.write(new_web)
        f1.write(new_password)
        f.close()
        print("更改成功")
    else:
        print("未找到对应网址或密码,请检查后重试")
#change_book()

def seek_book():
    f = open("book.txt", 'r')
    web = input("请输入网址:")
    password = input("请输入密码:")
    fr = f.read()
    f.close()
    if web in fr and password in fr:
        print("已找到:\n",fr)
    else:
        print("未找到对应网址或密码,请检查后重试")
#seek_book()

main()
while True:
    num = input("请输入操作指令:\n")
    num = int(num)
    if num == 1:
        add_book()
    elif num == 2:
        del_book()
    elif num == 3:
        change_book()
    elif num == 4:
        seek_book()
#print("输入错误,请重新输入")
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!