python库的解析--数据存储(txt文件读写,json库)

txt文件读写

import requests
from pyquery import PyQuery as pq

url = 'https://www.zhihu.com/explore'
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/86.0.4209.2 Safari/537.36'
}
html = requests.get(url=url, headers=headers, timeout=2).text
doc = pq(html)
items = doc('.ExploreSpecialCard-contentItem').items()
for item in items:
    tag = item.find('a.ExploreSpecialCard-contentTag').text()
    title = item.find('a.ExploreSpecialCard-contentTitle').text()
    with open('explore.txt', 'a', encoding='utf-8') as f:
        f.write('\n'.join([tag, title]))

json

import json

str = '''
[{
    "name": "Bob",
    "gender": "male",
    "age": "20"
},{
    "name": "Mike",
    "gender": "male",
    "age": "19"
},{
    "name": "李华",
    "gender": "男",
    "age": "25"
}]
'''
'''
    json格式的数值必须使用双引号包裹,否则loads()解析会失败
'''

# loads()读取Json
print(str)
print(type(str))
data = json.loads(str)
print(data)
print(type(data))
'''
    通过json.load()方法返回的是一个列表对象
    可以通过索引来获取data中的数据
'''
# json.load(fp, *, cls=None, object_hook=None,
# parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
'''
    object_hook 是一个可选的函数,它会被调用于每一个解码出的对象字面量(即一个 dict)
        object_hook 的返回值会取代原本的 dict。这一特性能够被用于实现自定义解码器(如 JSON-RPC 的类型提示)

    object_pairs_hook 是一个可选的函数,它会被调用于每一个有序列表对解码出的对象字面量
        object_pairs_hook 的返回值将会取代原本的 dict 。这一特性能够被用于实现自定义解码器
            !!! 如果 object_hook 也被定义, object_pairs_hook 优先。


    parse_float 如果指定,将与每个要解码JSON浮点数的字符串一同调用
        默认状态下,相当于 float(num_str) 
        可以用于对 JSON 浮点数使用其它数据类型和语法分析程序 (比如 decimal.Decimal )

    parse_int ,如果指定,将与每个要解码 JSON 整数的字符串一同调用
        默认状态下,相当于 int(num_str) 。可以用于对 JSON 整数使用其它数据类型和语法分析程序 (比如 float )

    parse_constant ,如果指定,将要与以下字符串中的一个一同调用: '-Infinity' , 'Infinity' , 'NaN' 
        如果遇到无效的 JSON 数字则可以使用它引发异常。
'''

# json.loads(s, *, cls=None, object_hook=None,
# parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

print(data[0]['name'])
print(data[0].get('name'))
'''
    可以通过data[0]['name']、data[0].get('name')这两种方法获取属性值
    这里建议使用get,这样的话当属性不存在时不会报错,会返回None
'''
print(data[0].get('birthday'))
print(data[0].get('birthday', '2000-8-29'))
'''
    get的第二个值表示默认数值
'''

# dumps()输出Json
with open('data.json', 'w', encoding='utf-8') as f:
    f.write(json.dumps(data, indent=2, ensure_ascii=False))
    '''
        indent表示缩进格数,为了保持json格式
        ensure_ascii用来保证中文等不会出现使用Unicode表示
    '''

# json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True,
# cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
'''
    skipkeys=True(默认为 False),那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过
        否则引发一个 TypeError
        
    ensure_ascii=True(默认值)输出保证将所有输入的非 ASCII 字符转义
        如果 ensure_ascii=False,这些字符会原样输出
        
    check_circular=False(默认为 True),容器类型的循环引用检验会被跳过并且循环引用会引发一个OverflowError
    
    allow_nan=False(默认为 True),那么在对严格 JSON 规格范围外的 float 类型值(nan、inf 和 -inf)
        进行序列化时会引发一个 ValueError
        如果 allow_nan=True,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity)
        
    indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级
    
    当separators被指定时,其应当是一个(item_separator, key_separator))元组
        当indent为None时,默认值取 (', ', ': '),否则取 (',', ': ')
        为了得到最紧凑的 JSON 表达式,应该指定其为 (',', ':') 以消除空白字符
        
    当 default 被指定时,其应该是一个函数,每当某个对象无法被序列化时它会被调用
        它应该返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError
        如果没有被指定,则会直接引发 TypeError
        
    sort_keys=true(默认为 False),那么字典的输出会以键的顺序排序
'''

# json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
# allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
# 使用这个 转换表 将 obj 序列化为 JSON 格式的 str。 其参数的含义与 dump() 中的相同

print(json.dumps(float('-inf')))
print(json.dumps(float('nan')))
print(json.loads('-Infinity'))
print(json.loads('NaN'))

# 编码器和解码器
# 简单的JSON解码器
# class json.JSONDecoder(*, object_hook=None, parse_float=None,
# parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
'''
    默认情况下,解码执行以下翻译:
    JSON        Python
    object      dict
    array       list
    string      str
    number(int) int
    number(real)float
    true        True
    false       False
    null        None
    
    strict=false(默认为 True),那么控制字符将被允许在字符串内
        在此上下文中的控制字符编码在范围 0--31 内的字符,包括 '\t' (制表符), '\n' , '\r' 和 '\0' 
    
    # decode(s)返回s的 Python表示形式(包含一个 JSON 文档的 str 实例)
        如果给定的 JSON 文档无效则将引发 JSONDecodeError
    # raw_decode(s) 
        从s中解码出 JSON 文档(以 JSON 文档开头的一个 str 对象)
        并返回一个 Python 表示形式为2元组以及指明该文档在 s 中结束位置的序号。

'''

# json.JsonDecode异常
# exception json.JSONDecodeError(msg, doc, pos)
'''
    msg 未格式化的错误消息
    doc 正在解析的 JSON 文档
    pos 解析失败的索引
    lineno 解析的行
    colno 解析的列
'''

# 用于Python数据结构的可扩展JSON编码器
# class json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True,
# allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
'''
    默认支持以下对象和类型:
        Python      JSON
        dict        object
        list, tuple array
        str         string
        int, float, int 和 float 派生的枚举   number
        True        true
        False       false
        None        null
'''

猜你喜欢

转载自blog.csdn.net/hide_in_darkness/article/details/108292665