Selenium之学习杂记(五)


如果你使用过API,那么你很可能会喜欢用API中那些已经处理好的数据。遗憾的是,在实际工作中,API的使用次数总是少的,大多数时候,都需要我们自己来进行数据的挖掘、整理和分析等操作。既然和互联网打交道,就少不了对各种数据类型进行转换。需要转换数据类型的根本原因是数据的存储方式和应用目的不同,计算机对不同类型的数据有不同的存储方式,比如,有的为了节省存储空间,有的则为了使用方便等。这些数据在编解码问题上往往比较麻烦。

读写CSV文件

CSV(Comma-Separated Value,逗号分隔值)就是采用逗号进行分隔的值。可以直接在txt文件中编辑CSV,这也意味着它是一个纯文本文件(只能包含数字和文字,不能包含图片和视频)。
Python的CSV库主要包含两个主要用法—— Reader和Writer,分别代表读和写。
自己编写一个city.csv文件
文件内容如下:

城市ID,城市名,城市名(英文),国家,国家CODE
AAAAAA,安道尔A,Andorra la Vella,安道尔A,AD
BBBBBB,安道尔B,Andorra la Vella,安道尔B,BD
CCCCCC,安道尔C,Andorra la Vella,安道尔C,CD
DDDDDD,安道尔D,Andorra la Vella,安道尔D,DD
EEEEEE,安道尔E,Andorra la Vella,安道尔E,ED
FFFFFF,安道尔F,Andorra la Vella,安道尔F,FD

CSV文件的读取很简单,但需要注意的是,你想要读取的文件包含的内容可能千奇百怪。因为网络上的文本质量参差不齐,错误的拼写、混乱的换行、空格以及混用的标点符号等都是我们处理数据时遇到的大问题,部分字符甚至可能在UTF-8编码中不存在,所以需要把error参数设置成ignore模式(忽略可能出现的编码错误)。

读取代码

import csv
# 打开文件
file = open('city.csv', 'r', encoding='utf-8', errors='ignore')
csv_file = csv.reader(file)
# 通过遍历元素来逐行输出
for i in csv_file:
    print(i)

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

import csv

# 需要写入文件
header = ["name", "gender", "score"]
file_1 = ["zhang_san", "男", "100"]
file_2 = ["Li_si", "女", "59"]
# 创建CSV文件
# 如果不加参数newline="",会多一行空格
csvFile = open('writer.csv','w',newline="")
writer = csv.writer(csvFile)
# 写入的内容都以列表的形式传入函数
writer.writerow(header)
writer.writerow(file_1)
writer.writerow(file_2)
# 关闭文件
csvFile.close()

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

读写JSON文件

JSON(JavaScript Object Notation,JavaScript对象标记)数据也是一种解决方式。JSON官方是这样介绍JSON的:一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。采用完全独立于语言的文本格式的JSON,是进行数据交换的理想格式。JSON基于一种“名称:值”的集合,这和Python的字典格式非常类似。其实是因为JSON沿用了类C语言家族(包括C、C++、Java、Python和Perl等)的习惯。如果读者使用过API,那么你会惊讶地发现,绝大部分API返回的数据都是JSON的。其实JSON和下面要讲解的XML有很大关联。它们的关系更像是老牌强者和后起之秀:本来XML独大,后来JSON逐渐占了上风。和XML相比,JSON具有以下特点,因此很多项目和网页的内容传输都使用JSON。●JSON内容简洁。●JSON采用压缩传输技术来节省宽带。●沿用了类C语言家族的习惯,适应的浏览器众多。●JSON格式简单,易于编写和解析。Python的库中同样有专门针对JSON的,并且这个库是Python自带的,所以我们完全不必耗费时间去安装它。JSON库主要包含4个方法,分别是loads()、dumps()、load()和dump()。其中load()和dump()与文件的读写相关。dumps()方法将dict转化成str格式,loads()方法将str转化成dict格式。下面是dumps()和loads()方法的使用示例。

import json
# 自定义json的示例数据
json_data = {
    "results": [
        {
            "location": {
                "id": "WX4FBXXFKE4F",
                "name": "北京",
                "country": "CN",
                "path": "北京,北京",
                "timezone": "Asia/Shanghai",
                "timezone_offset": "+08:00"
            }
        }
    ]
}
b = json.dumps(json_data)
print(b, type(b))
c = json.loads(b)
print(c, type(c))

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

import json
# 自定义json的示例数据
json_data = {
    "results": [
        {
            "location": {
                "id": "WX4FBXXFKE4F",
                "name": "北京",
                "country": "CN",
                "path": "北京,北京",
                "timezone": "Asia/Shanghai",
                "timezone_offset": "+08:00"
            }
        }
    ]
}
# 打开文件
f = open('test.txt', 'w')
print(type(f))
json.dump(json_data, f)
# tip 1
f.close()
# 先读取再关闭
f = open('test.txt', 'r')
print(f.read())
f.close()
# json读取test.txt的内容
f = open('test.txt', 'r')
print(json.load(f))
f.close()

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

将字典转化为XML

XML(eXtensible Markup Language,可扩展标记语言)是一种灵活的信息格式,规定了一系列编码转换的规则,它的设计理念是让信息可以同时被人和机器阅读。虽然XML文件占用的空间比单纯的二进制文件要多很多,但是这种可扩展标记语言更容易理解和掌握,它的这种明了性使其易于在任何语言、程序中读写数据。和HTML相比,XML继承了通用标准标记语言的的大部分功能,技术实现却要简单得多,但和前面提到的JSON相比,XML格式的数据在存储空间的有效比重上不太占优势。
那么,什么是XML呢?我们来看一个简单的例子。在这里插入图片描述
在解析XML的时候,我们主要会用到两个方法—— Element和tostring。前者用于创建一个XML文件,后者则用于将XML文件转换为可以被人读取、理解的字符形式的代码。在以下代码中,我们首先提供了一个字典,然后写了一个可以普遍使用的转换函数,再将字典转换为XML,接下来输出XML。第一次输出结果返回的是一个内存地址,字典的内容存储在这里。第二次输出将其转换为了字符串,接下来我们对最外层设置一个属性,并再次输出。

from xml.etree.ElementTree import tostring
from xml.etree.ElementTree import Element
dict = {"name": "zhang_san", "gender": "female", "phone_number": "01234567890", "note": "none"}
# 写一个转换函数
def covert(tag_name, dict):
    # 建立一个XML
    elem = Element(tag_name)
    # 通过双值循环取出字典中的键和值
    for key, value in dict.items():
        # 输出
        print(key,":",value)
        # 相当与为键创建一个标签
        xml_elem = Element(key)
        # 将键的值赋给这个标签
        xml_elem.text = str(value)
        # 添加到xml文件中
        elem.append(xml_elem)
    return elem
# 字典转换
dict_convert = covert("test", dict)
print("-------------------------------------")
print(dict_convert)
# 转换为可读的标准XML
print(tostring(dict_convert))
# 设置最外层标签属性
dict_convert.set('id_number', '01234567890')
# 再次输出
print(tostring(dict_convert))

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

Base64编码

Base64的名字在一定程度上解释了它的形式。Base64基于64个可打印字符来表示二进制数据。64是怎么来的呢?Base64编码中每6位是一个单元,而26等于64。Base64主要应用于对网络上传输的8位字节码编码(如电子邮件),也部分应用于加/解密(因为它的可逆性,严格意义上不算加密,只是采用Base64后对人来说不可读)。另外,曾经比较火爆的两款下载软件—— 迅雷、QQ旋风使用的专用链接也采用了Base64编码。Python中提供了一种Base64编码(这是内置库)的解决方案。在Python中,你使用Base64编解码就像使用print()那么简单。
Base64库只有两个主要函数—— encode()和decode()。下面给出一段使用encode()和decode()函数的示例代码。

import base64

# 定义字符串
string=b"admin"
# encode表示编码,decode表示解码
encoded=base64.b64encode(string)
decoded=base64.b64decode(encoded)
# 输出
print(encoded)
print(decoded)

执行结果
b’YWRtaW4=’
b’admin’

词性分析、统计分析NLTK

NLP(Natural Language Processing,自然语言处理)是一门涵盖语言学、计算机科学、人工智慧等领域的学科,是一种研究人与计算机之间如何用自然语言进行通信的理论方法。简单来说,NLP就是开发能够理解人类语言的应用程序或服务。这里讨论一些自然语言处理的例子,如分词、分句、词性划分、理解匹配词的同义词。当然,这并不是NLP能做的所有事情,在这里,读者只需要掌握常用的方法。

NLTK(Natural Language Toolkit,自然语言工具包)在使用Python处理自然语言的工具中处于领先的地位,同时,它基于Python构建。它提供了WordNet这种方便处理词汇资源的接口(拥有超过50个语料库和词汇资源),还有分类、分词、除茎、标注、语法分析、语义推理等类库。最让人惊喜的一点是,它基于Apache2.0开源协议免费发布。NLTK是一个第三方软件包,也是在NLP领域中最常使用的一个Python库。用户需要通过pip或者其他的包管理器或者源代码安装NLTK。然而,若仅仅安装NLTK库,它的大部分方法仍然无法使用。在NLTK中,自带了一个函数download()。
暂时不做过多说明

散列表

散列算法和一般的加密算法最大的区别在于一般的加密算法是一一映射(对特定值都进行某种变换,每个数有且仅有一个对应的函数值,每个函数值有且仅有一个对应的数,请参考函数的一一映射),因此理论上散列算法是可逆的。散列算法的定义域是一个无限集合,而值域(输出位数固定)是一个有限集合,将无限集合映射到有限集合,类似于“鸽笼原理”(Pigeonhole principle),每个散列结果都存在无数个可能的目标文本(请参考函数的满射)。因此,散列不是一个一一映射集合,定义域到值域的映射是不可逆的。散列算法是一类算法的统称,这类具有不可逆性特征的映射仅可以叫作散列算法和加密算法,但未必具备好的性能。好的散列算法和加密算法几乎不会发生文本碰撞(即输入的数不同,而输出的函数值相同)。好的散列算法应该对于内容的改变极其敏感,即使输入有很小的改动,如1亿个字符中变了1个字符,那么结果应该截然不同。这就是为什么散列算法可以用来检测软件的完整性。散列算法有很广泛的应用,加密常用的MD5(Message-Digest Algorithm 5,信息摘要算法5)、SHA(Secure Hash Algorithm,安全散列算法)都是散列算法。很多网站的密码都是采用散列算法加密的。当你忘记密码的时候,网站并不是将你忘记的密码发送给你,而是让你重新修改密码,然后让你用这个新密码登录。这是因为你在注册账号时输入的密码的散列值存储在数据库里,而散列算法不可逆,所以即使通过服务器也不可能复原你的密码,而只能重置密码。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值