我的python学习--第六天

一、pickle模块

python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

1、pickle模块有很多方法,这里主要讲的是dump和load方法:

1.1、pickle.dump():将字典格式的数据以二进制格式保存到文件中

>>> import pickle                                     # 导入pickle模块
>>> msg = {‘name‘:‘Alice‘,‘age‘:12}                   
>>> fo = open(‘test.txt‘,‘wb‘)                        # 新建一个二进制文件
>>> pickle.dump(msg,fo)                               # 写入数据
>>> fo.close()
[[email protected] python]# tail test.txt                     # 查看写入的数据
(dp0
S‘age‘
p1
I12
sS‘name‘
p2
S‘Alice‘
p3

1.2、pickle.load():从保存好的数据的文件读取数据

>>> import pickle
>>> content = {}                                      # 新建一个字典
>>> fo = open(‘test.txt‘)                             
>>> content = pickle.load(fo)                         # 读取数据到字典
>>> print content
{‘age‘: 12, ‘name‘: ‘Alice‘}

2、通过pickle模块实现增删改查

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import pickle

def create():                                        # 将字典格式数据以二进制格式写入文件
    users = {‘pc‘: ‘12345‘, ‘wd‘: ‘123‘, ‘kkk‘: ‘123‘}        
    fo = open(‘test.txt‘, ‘wb‘)
    pickle.dump(users,fo)
    fo.close()

def select():                                        # 从文件获取数据并显示
    content = {}
    f = open(‘test.txt‘)
    content = pickle.load(f)
    f.close
    print content
    for k,v in content1.items():
        print ("user info----%s--> %s" %(k,v))

def modify():                                        
    content = {}
    f = open(‘test.txt‘)
    content = pickle.load(f)                          # 获取数据
    print content 
    f.close
    content[‘pc‘] =‘467657‘                           # 修改数据
    f=open(‘test.txt‘,‘wb‘)

    pickle.dump(content,f)                            # 重新写入文件
    f.close()

def delete():
    content = {}
    f = open(‘test.txt‘)
    content = pickle.load(f)                          # 获取数据
    f.close
    content.pop(‘kkk‘)                                # 删除数据
    f = open(‘test.txt‘,‘wb‘)
    pickle.dump(content,f)                            # 将处理后的数据重新写入文件
    f.close()
    print content

if __name__ == ‘__main__‘:
    create()
    select()
    modify()
    delete()

3、通过pickle模块,实现一个基于文件存储的web端展示列表,实现用户注册、登录、修改密码,删除用户的功能

[[email protected] python]# tree test1
test1
├── templates
│   ├── index.html
│   ├── user.html
│   └── user_modify.html
├── user_file2.py
├── user.txt
└── user_web.py

前端代码

1、index.html

<form action=‘/login‘ method=‘post‘>
<div>
用户登录
</div>
name:<input type=‘text‘ name=‘name‘>
<br>
password:<input type=‘password‘ name=‘password‘>
<div>
<button type=‘submit‘>login</button>
</div>
</form>
<br>
<form action=‘/register‘ method=‘post‘>
<div>
用户注册
</div>
name:<input type=‘text‘ name=‘name‘>
<br>
password:<input type=‘password‘ name=‘password‘>
<br>
password again:<input type=‘password‘ name=‘repassword‘>
<div>
<button type=‘submit‘>register</button>
</div>
</form>
<form action=‘/showuser‘>
<div>
用户管理
</div>
<div>
<button type=‘submit‘>manage</button>
</div>
</form>

2、user.html

<table border=‘1‘>
    <thead>
        <tr>
	    <td>User</td>
	    <td>Password</td>
	    <td>Delete</td>
	    <td>Modify</td>
        </tr>
    </thead>

    <tbody>
      {%for user in users%}
      {%if user and users[user]%}
	<tr>
	    <td>{{user}}</td>
	    <td>{{users[user]}}</td>
	    <td><a href=‘/deluser?username={{user}}‘>delete</a></td>
	    <td><a href=‘/modify‘>modify</a></td>
	</tr>
      {%endif%}
      {%endfor%}
    </tbody>

</table>
</div>
<a href=‘/‘>返回首页</a>
<div>

3、user_modify.html

用户修改
<form action=‘/edit‘ method=‘post‘>
name:<input type=‘text‘ name=‘username‘>
<br>
old password:<input type=‘password‘ name=‘old_password‘>
<br>
new password:<input type=‘password‘ name=‘new_password‘> 
<br>
<button type=‘submit‘>修改用户</button>
</form>

逻辑端

1、user_file2.py

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import pickle

def showuser():                              # 从文件获取数据(字典格式)
    content = {}
    f = open(‘user.txt‘)
    content = pickle.load(f)
    f.close
    return content

def register(name,pwd):                      # 注册函数,通过在字典中添加用户名,密码实现
    content = {}
    fo = open(‘user.txt‘)
    content = pickle.load(fo)
    fo.close()
    content[name] = pwd
    fo = open(‘user.txt‘,‘wb‘)
    pickle.dump(content,fo)
    fo.close()

def edit(name,pwd,repwd):                    # 修改密码
    content = {}
    f = open(‘user.txt‘)
    content = pickle.load(f)
    print (content)
    f.close
    for n,p in content.items():
        if n == name and p == pwd and pwd != repwd:
	    content[name] = repwd
    f = open(‘user.txt‘,‘wb‘)
    pickle.dump(content,f)
    f.close()

def deluser(name):                           # 删除用户
    content = {}
    f = open(‘user.txt‘)
    content = pickle.load(f)
    f.close
    if name in content.keys():
         content.pop(name)
    f = open(‘user.txt‘,‘wb‘)
    pickle.dump(content,f)
    f.close()

2、user_web.py

from flask import Flask,request,render_template,redirect
import user_file2
#new app
app = Flask(__name__)

@app.route(‘/‘)
def index():
    return render_template(‘index.html‘)

@app.route(‘/register‘,methods=[‘POST‘])       # 注册路由
def register():
    name = request.form.get(‘name‘)
    pwd = request.form.get(‘password‘)
    repwd = request.form.get(‘repassword‘)
    
    if name != ‘‘ and pwd != ‘‘ and pwd==repwd and name not in user_file2.res_dict().keys():                                            # 条件判断 
        user_file2.register(name,pwd)
        return redirect(‘/showuser‘)
    else:
	return ‘someting error‘

@app.route(‘/showuser‘)                        # 表格形式,显示数据端数据
def showuser():
    users = user_file2.showuser()
    return render_template(‘user.html‘, users = users)

@app.route(‘/deluser‘)                         # 删除用户
def deluser():
    username = request.args.get(‘username‘)
    user_file2.deluser(username)
    return redirect(‘/showuser‘)

@app.route(‘/login‘,methods=[‘POST‘])          # 登录功能
def login():
    name = request.form.get(‘name‘)
    pwd = request.form.get(‘password‘)

    res_dict = user_file2.res_dict()
    if name not in res_dict.keys():
        return "wrong name"
    elif pwd != res_dict[name]:
        return "wrong password"
    else:
        return "login success"

@app.route(‘/modify‘,methods=[‘GET‘,‘POST‘])   # 修改密码
def modify():
    if request.method==‘POST‘:
        name = request.form.get(‘username‘)
        old_pwd = request.form.get(‘old_password‘)
        new_pwd = request.form.get(‘new_password‘)

        return render_template(‘user_modify.html‘,username=name,old_password=old_pwd,new_password=new_pwd)
    else:
        return render_template(‘user_modify.html‘)
   
@app.route(‘/edit‘,methods=[‘POST‘])            # 在数据端修改密码
def edit():
    name = request.form.get(‘username‘)
    old_pwd = request.form.get(‘old_password‘)
    new_pwd = request.form.get(‘new_password‘)

    if name != ‘‘ and old_pwd != ‘‘ and new_pwd != ‘‘ and old_pwd != new_pwd and name in user_file2.res_dict().keys() and old_pwd==user_file2.res_dict()[name]: 
        user_file2.edit(name,old_pwd,new_pwd)
        return redirect(‘/showuser‘)
    else:
	return ‘something error‘
		    
if __name__ == ‘__main__‘:
    app.run(host=‘0.0.0.0‘, port=8888,debug=True)

数据端

[[email protected] test1]# cat user.txt 
(dp0
Vpc
p1
V123456
p2
sV123
p3
V1234
p4
sS‘yaoliang‘
p5
V123456
p6

二、数据库模块MySQL

1、安装并启动数据库(CentOS 7 以上使用的是mariadb)

[[email protected] python]# yum install -y mariadb-server mariadb     # 安装
[[email protected] python]# systemctl start mariadb.service           # 启动
[[email protected] python]# mysql_secure_installation                 # 初始化

2、安装python的数据库模块

[[email protected] python]# yum install -y python-pip
[[email protected] python]# pip install MySQL-python

3、测试安装是否成功

>>> import MySQLdb as mysql
>>>                                                           # 无返回,说明安装成功

4、创建数据库和表

MariaDB [(none)]> create database reboot;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use reboot;
Database changed
MariaDB [reboot]> create table users(
    ->     id int AUTO_INCREMENT primary key 
    ->     ,name varchar(20) not null 
    ->     ,name_cn varchar(50) not null 
    ->     ,password varchar(50) not null 
    ->     ,email varchar(50)
    ->     ,mobile varchar(11)
    ->     ,role varchar(10) not null
    ->     ,status tinyint
    ->     ,create_time timestamp default current_timestamp 
    ->     ,last_time timestamp default current_timestamp 
    ->     ,unique key  name (name) ) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

MariaDB [reboot]> show tables;
+------------------+
| Tables_in_reboot |
+------------------+
| users            |
+------------------+
1 row in set (0.00 sec)

MariaDB [reboot]> desc users;
+-------------+-------------+------+-----+-------------------+----------------+
| Field       | Type        | Null | Key | Default           | Extra          |
+-------------+-------------+------+-----+-------------------+----------------+
| id          | int(11)     | NO   | PRI | NULL              | auto_increment |
| name        | varchar(20) | NO   | UNI | NULL              |                |
| name_cn     | varchar(50) | NO   |     | NULL              |                |
| password    | varchar(50) | NO   |     | NULL              |                |
| email       | varchar(50) | YES  |     | NULL              |                |
| mobile      | varchar(11) | YES  |     | NULL              |                |
| role        | varchar(10) | NO   |     | NULL              |                |
| status      | tinyint(4)  | YES  |     | NULL              |                |
| create_time | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| last_time   | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+-------------+------+-----+-------------------+----------------+
10 rows in set (0.00 sec)

5、数据库执行流程

# 导入数据库模块
>>> import MySQLdb as mysql
# 连接数据库
>>> conn = mysql.connect(db=‘reboot‘,user=‘root‘,passwd=‘123456‘,host=‘localhost‘)
# 创建游标
>>> cur = conn.cursor()
# 编写sql语句
>>> sql = "insert into users(name,name_cn,password,mobile,role,status) values(‘test‘,‘test‘,‘123456‘,‘12345678901‘,1,0)"
# 执行sql语句
>>> cur.execute(sql)
1L
# 提交结果
>>> conn.commit()
# 关闭游标和数据库连接
>>> cur.close()
>>> conn.close()

6、查看数据库是否导入成功

1、连接数据库查看

MariaDB [(none)]> MariaDB [(none)]> select * from reboot.users;
+----+------+----------------+----------+-------+-------------+------+--------+---------------------+---------------------+
| id | name | name_cn        | password | email | mobile      | role | status | create_time         | last_time           |
+----+------+----------------+----------+-------+-------------+------+--------+---------------------+---------------------+
|  1 | test | test           | 123456   | NULL  | 12345678901 | 1    |      0 | 2016-08-08 15:57:28 | 2016-08-08 15:57:28 |
+----+------+----------------+----------+-------+-------------+------+--------+---------------------+---------------------+
1 row in set (0.00 sec)

2、通过fetchall()和fetchone()查看

>>> import MySQLdb as mysql
>>> conn = mysql.connect(db=‘reboot‘,user=‘root‘,passwd=‘123456‘,host=‘localhost‘)
>>> cur = conn.cursor()
>>> cur.execute(‘select * from users‘)         # 执行select操作
>>> cur.fetchall()                             # fetchall()查找所有数据
((1L, ‘test‘, ‘test‘, ‘123456‘, None, ‘12345678901‘, ‘1‘, 0, datetime.datetime(2016, 8, 8, 15, 57, 28), datetime.datetime(2016, 8, 8, 15, 57, 28)), (3L, ‘test1‘, ‘test1‘, ‘123456‘, None, ‘12345678901‘, ‘1‘, 0, datetime.datetime(2016, 8, 8, 16, 5, 55), datetime.datetime(2016, 8, 8, 16, 5, 55)))
>>> cur.execute(‘select * from users‘)
2L
>>> cur.fetchone()                             # fetchone()查找数据中第一个
(1L, ‘test‘, ‘\xe6\xb5\x8b\xe8\xaf\x95‘, ‘123456‘, None, ‘12345678901‘, ‘1‘, 0, datetime.datetime(2016, 8, 8, 15, 57, 28), datetime.datetime(2016, 8, 8, 15, 57, 28))
>>> cur.fetchone()                             # 第二次则查找第二个
(3L, ‘test1‘, ‘test1‘, ‘123456‘, None, ‘12345678901‘, ‘1‘, 0, datetime.datetime(2016, 8, 8, 16, 5, 55), datetime.datetime(2016, 8, 8, 16, 5, 55))

7、结合数据库,实现数据的查询

逻辑端代码

#!/usr/bin/python
#coding:utf-8

from flask import Flask,render_template
import MySQLdb as mysql

app = Flask(__name__)
conn = mysql.connect(db=‘reboot‘,user=‘root‘,passwd=‘123456‘,host=‘localhost‘)
cur = conn.cursor()

@app.route(‘/userlist‘)
def userlist():
    sql = "select name,name_cn,email,mobile from users"
    cur.execute(sql)
    result = cur.fetchall()                                # 获取所有数据
    return render_template(‘userlist.html‘, users = result)

if __name__==‘__main__‘:
    app.run(host=‘0.0.0.0‘,port=8888,debug=True)

前端userlist.html代码

<table border=‘1‘>
    <thead>
      <tr>
          <td>用户名</td>
          <td>中文名</td>
          <td>邮箱</td>
          <td>手机号</td>
          <td>操作</td>
      </tr>
    </thead>
    <tbody>
      {% if users %}
      {% for user in users %}
      <tr>
          <td>{{user[0]}}</td>
          <td>{{user[1]}}</td>
	  <td>{{user[2]}}</td>
	  <td>{{user[3]}}</td>
	  <td> <input type=‘button‘ name=‘updata‘ value=‘更新‘‘>
	  <input type=‘button‘ name=‘del‘ value=‘删除‘‘></td>
      </tr>
      {%endfor%}
      {%endif%}
    </tbody>
</table>

运行结果

8、对7中的逻辑端代码进行优化

逻辑端

#!/usr/bin/python
#coding:utf-8

from flask import Flask,render_template
import MySQLdb as mysql

app = Flask(__name__)
conn = mysql.connect(db=‘reboot‘,user=‘root‘,passwd=‘123456‘,host=‘localhost‘)
cur = conn.cursor()

@app.route(‘/userlist‘)
def userlist():
    users = []
    fields = [‘name‘,‘name_cn‘,‘email‘,‘mobile‘]            
    sql = "select %s from users"%‘,‘.join(fields)
    cur.execute(sql)
    result = cur.fetchall()
    for row in result:
        user = {}
        for i,k in enumerate(fields):
            user[k] = row[i]
        users.append(user)
    return render_template(‘userlist.html‘, users = result)

if __name__==‘__main__‘:
    app.run(host=‘0.0.0.0‘,port=8888,debug=True)

前端代码

<table border=‘1‘>
    <thead>
      <tr>
          <td>用户名</td>
          <td>中文名</td>
          <td>邮箱</td>
          <td>手机号</td>
          <td>操作</td>
      </tr>
    </thead>
    <tbody>
      {% if users %}
      {% for user in users %}
      <tr>
          <td>{{user.name}}</td>
          <td>{{user.name_cn}}</td>
          <td>{{user.email}}</td>
          <td>{{user.mobile}}</td>
          <td> <input type=‘button‘ name=‘updata‘ value=‘更新‘‘>
          <input type=‘button‘ name=‘del‘ value=‘删除‘‘></td>
      </tr>
      {%endfor%}
      {%endif%}
    </tbody>
</table>
时间: 2024-12-15 07:15:24

我的python学习--第六天的相关文章

python学习第六天 - 列表(数组)

python当中的数组与java,c不太一样,数组相当于一个列表,一个列表中可以有,整型,字符串,浮点型等等. 定义格式如下: >>> list = [123,'小甲鱼',3.14] >>> list [123, '小甲鱼', 3.14] 介绍几种向列表中添加元素的方法 1.append() :向列表中增加新的元素,一次只能添加一个元素,默认添加到列表的末尾 >>> list.append('黑夜') >>> list [123, '

据廖雪峰python3教程----python学习第六天

dict Python内置了字典,dict全程dictionary,在其他语言中也称为map,使用 键-值(key-value)储存,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用 list 实现,需要两个 list: >>> name = ['xiaoming','xiaohong','xiaolan'] >>> scores = [90,75,59] 给定一个名字,要查找对应的成绩,就要在names中找到对应的位置,再从scores取出对

Python学习第六天----Linux内存管理、进程管理、RPM包安装管理及源码安装软件

Linux内存管理.进程管理.RPM包安装管理及源码安装软件 一.交换分区     交换分区其实就相当于Windows系统下的虚拟内存的概念,当物理内存不够用的时候,由操作系统将硬盘的一块区域划分出来作为内存使用.具体使用方法如下:      [[email protected] ~]# fdisk -l 磁盘 /dev/sdb:16.1 GB, 16106127360 字节,31457280 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):5

Python学习第六天

模块: shutil 模块: 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容 1 def copyfileobj(fsrc, fdst, length=16*1024): 2 """copy data from file-like object fsrc to file-like object fdst""" 3 while 1:

python学习第六天:python基础(dict、set)

dict dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度 创建&取值 为什么dict查找速度这么快? 因为dict的实现原理和查字典是一样的.假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢. 第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字.无论找哪个

2018-11-21 python学习第六天

l=['a','b','c'] print(len(l)) #显示三个字符 i=0 while i<len(l): print(l[i]) i+=1 l=['a','b','c'] for item in l: #item='a' # for循环打印列表内的元素 print(item) dic={'x':111,'y':222,'z':333} for k in dic: #k='x' #for取值字典 也只是取值key,不取值value print(k,dic[k]) #逐行打印key 和va

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令