023-2018-1009 简单爬虫+序列化+configparser模块

1.今日内容大纲

一. 上节课内容回顾
     1. collections
        namedtuple: 命名元组. 创建类
        Counter: 计数器
        deque: 双向队列
            stack: 栈  先进后出
            queue: 队列  先进先出
        OrderedDict 有序字典. 浪费内存
        defaultdict:  默认值字典
            d = defaultdict(callable)
            ret = d.get("周润发")

            ret是 callable()

     2. time模块
        1. 时间戳. float 数字. 1970-01-01 00:00:00
        2. 格式化时间. %Y-%m-%d %H:%M:%S      %Y-%m-%d
        3. 结构化时间. 把时间拆分了。
        时间戳 -> 格式化时间
            f = 10086
            st = time.localtime(f)
            s = time.strftime("%Y-%m-%d %H:%M:%S", st)
        格式化时间 -> 时间戳
            s = "2018-01-01 12:58:46"
            st = time.strptime(s, "%Y-%m-%d %H:%M:%S")
            f = time.mktime(st)

        sleep()

     3. random
        random.randint(start, end) [start, end]随机整数
        random.choice() 随机选择
        random.sample() 随机选择n个
     4. os和sys
        os 和操作系统相关
        sys  和解释器相关的
        sys.path.clear()

二. 作业
1、回顾文件递归遍历. 默写一遍.
 入口在:  当文件是个文件夹的时候
出口在: 文件是一个文件

2、写一个copy函数,接受两个参数,第一个参数是源文件的位置,第二个参数是目标位置,将源文件copy到目标位置。

3、计算时间差(用户输入起始时间和结束时间. 计算时间差(小时), 
 		例如, 用户输入2018-10-08 12:00:00   2018-10-08 14:30:00 输出2小时30分

3、使用random.random()来计算[m,n]以内的随机整数


5、使用os模块创建如下目录结构
# glance
# ├── __init__.py
# ├── api
# │   ├── __init__.py
# │   ├── policy.py
# │   └── versions.py
# ├── cmd
# │   ├── __init__.py
# │   └── manage.py
# └── db
#      ├── __init__.py
#      └── models.py

 6. 写一个用户注册登陆的程序,每一个用户的注册都要把用户名和密码用字典的格式写入文件userinfo。在登陆的时候,再从文件中读取信息进行验证。




明日默写内容:

1. 时间戳转换成格式化时间
2. 格式化时间转换成时间戳
三. 今日主要内容
    1. 序列化
        把对象打散成bytes或者字符串。 方便存储和传输 序列化
        把bytes或者字符串转换回对象。 反序列化

    2. pickle(比较重要)
        把python中所有的对象都可以转化成bytes。进行存储和传输
        dumps()  序列化。 不写文件
        loads() 反序列化, 不读文件
        dump()
        load()

    3. shelve
        小型数据库. 操纵的是文件类型的字典.
        shelve.open(文件, writeback=True)

    4. json(重点)
        前后端数据交互的通用的数据格式。
        dumps() 把字典转化成字符串
        loads() 把字符转化成字典

        处理中文
            ensure_ascii = False

    5. configparser
        处理配置文件的。
        把配置文件作为一个大字典来处理就型了

    明天预习:
        正则表达式
        re模块

2.练习

from collections import defaultdict
def chi():
    print("刘伟走了? 大阳哥来了")
    return 123
d = defaultdict(chi)
print(d["jay"]) # dict()

import time
# print("大阳哥要睡觉了")
# time.sleep(10)
# print("大阳哥醒了")
while 1:
    s = time.strftime("%Y-%m-%d %H:%M:%S")
    print(s)
    time.sleep(1)

# 在这里之前。 很多模块已经导入进内存了。 自己的模块不要和python的模块冲突.
import sys
import builtins
print(sys.path) # 搜索模块的路径, django . flask
print(sys.modules.keys())
sys.path.clear() # 寻找模块的路径给删了. 但是。 内存里的面的模块还在
import json # 这里会报错.
import os
def copy(source, path):
    path = os.path.join(path, os.path.basename(source))
    with open(source, mode="rb") as f1, open(path, mode="wb") as f2:
        for line in f1:
            f2.write(line)

copy("c:\\timg.jpg","d:\\")

# 计算时间差(用户输入起始时间和结束时间. 计算时间差(小时),
#  		例如, 用户输入2018-10-08 12:00:00   2018-10-08 14:30:00 输出2小时30分
import time
start_str = "2018-10-08 12:00:00"
end_str = "2018-10-08 14:30:00"

start_float = time.mktime(time.strptime(start_str, "%Y-%m-%d %H:%M:%S"))
end_float = time.mktime(time.strptime(end_str, "%Y-%m-%d %H:%M:%S"))

diff_second = end_float - start_float # 计算相差的秒数

diff_min = diff_second // 60 # 计算出分钟  150

show_hour = diff_min // 60
show_min = diff_min % 60

print(show_hour, show_min)

import random

# 获取[m, n]的随机整数

import os


3.pickle模块

import pickle

#  dumps 序列化。 把对象转化成bytes
#  loads 反序列化。 把bytes转化成对象
#  dump 序列化。 把对象转化成bytes并写入文件
#  load 反序列化。把文件中的bytes读取。转化成对象

class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def catchMouse(self):
        print(self.name, self.age, "抓老鼠")


c = Cat("jerry", 18)
c.catchMouse()


# # dumps 把对象转化成bytes  序列化
bs = pickle.dumps(c)
print(bs)

# 把bytes 转换回对象  反序列化
ccc = pickle.loads(bs)
ccc.catchMouse()

dic = {"jay": "周杰伦", "jj": "大阳哥"}
bs = pickle.dumps(dic)
print(bs)

d = pickle.loads(bs)
print(d)





c = Cat("jerry", 18)
f = open("pickle-test", mode="wb")
pickle.dump(c, f) # 结果人是看不了的。

f.close()
f = open("pickle-test", mode="rb")
c = pickle.load(f)
c.catchMouse()

lst = [Cat("猫1", 10), Cat("猫2", 9), Cat("猫3", 9), Cat("猫4", 9), Cat("猫5", 9)]

f = open("pickle-test", mode="wb")
pickle.dump(lst, f)
# for el in lst:
#     pickle.dump(el, f)

f.flush()
f.close()

f = open("pickle-test", mode="rb")
while 1:
    try:
        c1 = pickle.load(f)
        c1.catchMouse()
    except EOFError:
        break






4.shelve

import shelve

# 打开一个文件
f = shelve.open("大阳哥", writeback=True)
f['jj'] = "林俊杰"
f['dyg'] = "大阳哥"
f['zzr'] = "周芷若"

f = {}
# 像操作字典一样操作文件
f["jay"] = "周杰伦"
print(f['jay'])



f["jay"] = {'name': "周杰伦", 'age': 38, "hobby": "吃喝拉撒睡"}

f['jay']['name'] = "胡辣汤"
print(f['jay']['name'])
print(f['jay'])

# f.close()




f = shelve.open("大阳哥")
print(f.keys())
for k in f.keys(): # 可以获取到所有的key
    print(k)

for k in f:
    print(k)

for k, v in f.items():
    print(k, v)

5.json

wf = {
    "name": "汪峰",
    "age": 18,
    "hobby": "抢头条",
    "wife": {
        "name": "子怡",
        "age": 19,
        "hobby":["唱歌", "跳舞", "演戏"]
    }
}

wf['wife']['hobby']
class Person:
    def __init__(self, name, age, hobby, wife):
        self.name = name

import json
dic = {"a": '理查德姑妈', "b": "找到你", "c": "看不见的客人"}

# s = json.dumps(dic) # 如果你的key或者value超出了ascii范畴。 就会显示成\uxxxxx
s = json.dumps(dic, ensure_ascii=False) # 干掉ascii码
print(repr(s), type(s))


# 把字符串解析成 字典
dic1 = json.loads(s)
print(dic1, type(dic1))

# 写入
f = open("waimai.json", mode="w", encoding="utf-8")
json.dump(dic, f, ensure_ascii=False)   # 把json写入到文件中
f.close()

# 读出
f = open("waimai.json", mode="r", encoding="utf-8")
s = json.load(f) # 把文件中的json串。读取成字典
print(s, type(s))

lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}]
f = open("menu.json", mode="w", encoding="utf-8")
for dic in lst:
    json.dump(dic, f, ensure_ascii=False)
f.close()

f = open("menu.json", mode="r", encoding="utf-8")
s = json.load(f)
print(s)

# 写入的时候
# 1. 循环
# 2. 用dumps把字典转化成字符串, 然后手工在后面加一个\n
# 3. 写出
f = open("new_menu.json", mode="w", encoding="utf-8")
lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}]
for el in lst:
    s = json.dumps(el, ensure_ascii=False) + "\n"
    f.write(s)

f.flush()
f.close()


# 读取的时候
# 1. for line in f:
# 2. strip()去掉空白
# 3. loads()变成字典

f = open("new_menu.json", mode="r", encoding="utf-8")
for line in f:
    line = line.strip()
    dic = json.loads(line)
    print(dic)

6.configparser

import configparser

conf = configparser.ConfigParser()
conf["DEFAULT"] = {
    "session-time-out":30,
    "user-alive": 60,
    "connect-alive":10
}

conf["189-DB"] = {
    "ip": "189.135.63.12",
    "port": 3306,
    "uname": "root",
    "password": "root"
}


conf["166-DB"] = {
    "ip": "189.135.63.12",
    "port": 3306,
    "uname": "root",
    "password": "root"
}


conf["163-DB"] = {
    "ip": "189.135.63.12",
    "port": 3306,
    "uname": "root",
    "password": "root"
}

f = open("db.ini", mode="w")
conf.write(f) # 把文件扔进去。 写到这个文件里


# 读取内容
conf = configparser.ConfigParser()
conf.read("db.ini")
print(conf.sections()) # 获取到章节 keys()
print(conf['166-DB']["ip"])  # 可以像字典一样操作
print(conf["166-DB"]["port"])
print(conf["166-DB"]["uname"])
print(conf["166-DB"]["password"])

for key in conf['163-DB']:
    print(key)

for key, value in conf['163-DB'].items():
    print(key, value)


# 增删改操作
conf = configparser.ConfigParser()
conf.read("db.ini") # 读取出来

conf['163-DB']['uname'] = "alex"
# del conf['163-DB']["password"]
conf.set("163-DB", "wangermazi", "189") # setattr

conf.add_section("jay")
conf.write(open("db.ini", mode="w"))



7.其他补充

<1>. db.ini


[DEFAULT]
session-time-out = 30
user-alive = 60
connect-alive = 10

[189-DB]
ip = 189.135.63.12
port = 3306
uname = root
password = root

[166-DB]
ip = 189.135.63.12
port = 3306
uname = root
password = root

[163-DB]
ip = 189.135.63.12
port = 3306
uname = alex
wangermazi = 189

[jay]

<2>. menu.json

{"a": "胡辣汤","m":{"a":"1"}}
{"b": "吱吱冒油的大猪蹄子"}
{"c": "盖浇饭"}
{"d": "马拉"}
{"e": "法国大蜗牛"}

<3>. new_menu.josn

{"a": "胡辣汤"}
{"b": "吱吱冒油的大猪蹄子"}
{"c": "盖浇饭"}
{"d": "马拉"}
{"e": "法国大蜗牛"}

<4>. out.json

{"a": "理查德姑妈", "b": "找到你", "c": "看不见的客人"}

<5>. wf.xml

<?xml version="1.0" encoding="utf-8" ?>
<wf>
    <name>汪峰</name>
    <age>18</age>
    <hobby>抢头条</hobby>
    <wife>
        <name></name>
    </wife>
</wf>

<6>. orange_hero.bak

'jay', (0, 81)
'jj', (512, 19)
'dyg', (1024, 19)
'zzr', (1536, 19)

<7>. orange_hero.dir

'jay', (0, 81)
'jj', (512, 19)
'dyg', (1024, 19)
'zzr', (1536, 19)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值