假设现在有一张便条:
- mya:
- 祝你今天愉快,你明天的愉快留着我明天再祝。
- 肆拾伍 4.20
将上面的转换成三种格式:
csv:
“ mya:”,“祝你今天愉快,你明天的愉快留着我明天再祝。”,“肆拾伍” ,“4.20”
xml:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>mya</to>
\<content>祝你今天愉快,你明天的愉快留着我明天再祝。/content>
<from>肆拾伍</from>
<date>4.20</date>
</note>
json:
{to:"mya",content:"祝你今天愉快,你明天的愉快留着我明天再祝。",from:"肆拾伍",date:"4.20"}
CSV(Comma Separated Values)是用逗号分隔数据项(也称为字段)的数据交换格式,CSV主要应用于电子表格和数据库之间的数据交换。
Python提供csv模块实现读写CSV文件。
模块函数
csv.reader(csvfile, dialect=‘excel’, **fmtparams)
csv.writer(csvfile, dialect=‘excel’, **fmtparams)
- dialect参数是方言,方言提供了一组预定好的格式化参数;fmtparams参数可以提供单个格式化参数。
- 方言dialect实际参数是csv.Dialect的子类,csv.Dialect的子类主要有:
csv.excel类定义Excel生成的CSV文件的常用属性。它用方言名称是’excel’。 - csv.excel_tab类定义了Excel生成的Tab(水平制表符)分隔文件的常用属性。它用方言名称是’excel-tab’。
- csv.unix_dialect类定义在UNIX系统上生成的CSV文件的常用属性,即使用’\n’作为行终止符,而Windows下使用’\r\n’作为行终止符。它用方言名称是’unix’。
假设现在有一个csv文本如下:
1,软件工程,戴国强,机械工业出版社,19980528,2
2,汇编语言,李利光,北京大学出版社,19980318,2
3,计算机基础,王飞,经济科学出版社,19980218,1
4,FLASH精选,刘扬,中国纺织出版社,19990312,2
5,java基础,王一,电子工业出版社,19990528,3
6,世界杯,柳飞,世界出版社,19990412,2
7,JAVA程序设计,张余,人民邮电出版社,19990613,1
8,新概念3,余智,外语出版社,19990723,2
import csv
with open('test.csv','r',encoding= 'utf-8') as f:
content = csv.reader(f, dialect="excel")
content = list(content) # 也可以不转成list,但是那种可迭代对象只能访问一次
for row in content:
print(row) # 输出为列表
for row in content: # 如果不是list 这里的输出为空
print("|".join(row)) # 输出为字符串
with open('test2.csv','w+',encoding = 'utf-8',newline = '') as ff: # 注意添加 newline = '',表示写的时候不用加回车换行
writer = csv.writer(ff,delimiter = '\t') # 分割符为制表符
for row in content :
writer.writerow(row)
不加newline的显示效果:
加了newline的显示效果:
XML 文档;
解析XML文档在目前有两种流行的模式:SAX和DOM。
SAX(Simple API for XML)是一种基于事件驱动的解析模式。 只能用于读取解析,不能写入。
DOM(Document Object Model)将XML文档作为一棵树状结构进行分析,获取节点的内容以及相关属性,或是新增、删除和修改节点的内容。
Python官方提供的XML模块为: xml.etree.ElementTree
这个大致上是基于DOM方式来解析的,
假设现在有一个XML文档内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Notes>
<Note id="1">
<CDate>2018-3-21</CDate>
<Content>发布Python0</Content>
<UserID>tony</UserID>
</Note>
<Note id="2">
<CDate>2018-3-22</CDate>
<Content>发布Python1</Content>
<UserID>tony</UserID>
</Note>
<Note id="3">
<CDate>2018-3-23</CDate>
<Content>发布Python2</Content>
<UserID>tony</UserID>
</Note>
<Note id="4">
<CDate>2018-3-24</CDate>
<Content>发布Python3</Content>
<UserID>tony</UserID>
</Note>
<Note id="5">
<CDate>2018-3-25</CDate>
<Content>发布Python4</Content>
<UserID>tony</UserID>
</Note>
</Notes>
解析代码:
import xml.etree.ElementTree as ET
tree = ET.parse('Notes.xml') # 创建XML文档树
print(type(tree))
root = tree.getroot() # root是根元素
print(root.tag) # 元素具有 标签tag 属性attrib 这两个属性
print(root.attrib)
for child in root:
print('{0}:{1}-{2}'.format(child.tag,child.attrib,child.text))
for cchild in child:
print('{0}:{1}-{2}'.format(cchild.tag,cchild.attrib,cchild.text))
使用Xpath
XPath是专门用来在XML文档中查找信息的语言,XPath将XML的中所以元素、属性和文本都看作节点(Node),根元素就是根节点,它没有父节点,属性称为属性节点,文本称为文本节点。
- find(match, namespaces=None)。查找匹配的第一个子元素。match可以是标签名或XPath。返回元素对象或None。namespaces是指定命名空间,如果namespaces非空,那么查找会在指定的命名空间的标签中进行。
- findall(match, namespaces=None)。查找所有匹配的子元素,参数同find()方法。返回值是符合条件的元素列表。
- findtext(match, default=None, namespaces=None)。查找匹配的第一个子元素的文本,如果未找到元素,则返回默认。default参数是默认值,其他参数同find()方法。
表达式 | 说明 | 例子 |
---|---|---|
. | 选择当前节点 | ./Note表示所有Note子节点 |
/ | 路径指示符,用于分隔 | ./Note/CDate表示Note子节点下的所有CDate节点 |
.. | 选择父节点 | ./Note/CDate/. .表示CData节点的父节点,其实就是Note节点 |
// | 所有后代节点,包括子节点的子节点 | .//CDate表示所有CDate的后代节点 |
[@attrib] | 选择指定属性的所有节点 | ./Note[@id] 表示所有具有id属性的Note节点 |
[@attrib=‘value’] | 表示指定属性等于value的所有节点 | ./Note[@id=‘2’]表示id等于2的Note节点 |
[position] | 指定位置的节点,从1开始,last()指最后一个 | ./Note[1]表示第一个Note子节点,./Note[last()-1]表示倒数第二个Note子节点 |
还是以上面的XML文档为例:
# coding = utf-8
import xml.etree.ElementTree as ET
tree = ET.parse('Notes.xml') # 创建XML文档树
root = tree.getroot() # root是根元素
node = root.find('./Note') # 返回第一个找到的Note节点
print(node.tag,node.attrib)
node = root.find('./Note/CDate') # 返回第一个找到的CDate节点
print(node.tag,node.text) # 返回第一个CDate的标签和内容
node = root.find('./Note/CDate/..') # 返回CDate的父节点
print(node.tag,node.attrib)
nodelist = root.findall('./Note//') # 因为子节点有很多所以用findall,find只返回一个
print(nodelist[1].tag,nodelist[1].text) # findall 返回的是对象列表,所以可以引用访问
nodelist = root.findall("./Note[@id]")
print(nodelist[0].tag,nodelist[0].attrib)
node = root.find("./Note[@id='2']")
print(node.tag,node.attrib)
node = root.find("./Note[last()-1]")
print(node.tag,node.attrib)
XML解析到此为止,下面介绍json格式文档处理。
在python中解析json和json编码可以使用json模块。
注意:JSON字符串一定用双引号("),在JSON对象中名称也需要双引号("),不能使用单引号(’)
python中的数据类型和json数据类型的对应关系:
JSON | Python |
---|---|
对象 | 字典 |
数组 | 列表 |
字符串 | 字符串 |
true | True |
false | False |
null | None |
编码函数:
dumps()函数将编码的结果以字符串形式返回。
dump()函数将编码的结果保存到文件对象(类似文件对象或流)中。
import json
py_dict = {'name': 'tony', 'age': 30, 'sex': True} # 创建字典对象
py_list = [1, 3] # 创建列表对象
py_tuple = ('A', 'B', 'C') # 创建元组对象
py_dict['a'] = py_list # 添加列表到字典中
py_dict['b'] = py_tuple # 添加元组到字典中
print(py_dict) # 用字典表示的json内容
print(type(json_dict))
# 编码
json_obj = json.dumps(py_dict) # 可以指定indent参数,用于表示缩进
print(json_obj)
print(type(json_obj)) # 本质上是str类型
with open('test.json', 'w') as f: # 用于写入文件
json.dump(py_dict, f)
json模块提供的解码函数是loads()和load():
loads()函数将JSON字符串数据进行解码,返回Python数据。
load()函数读取文件或流对其中的JSON数据进行解码,返回结果Python数据。
两个函数的使用方法如下:
import json
# json数据
json_obj = r'{"name": "tony", "age": 30, "sex": true, "a": [1, 3], "b": ["A", "B", "C"]}'
py_dict = json.loads(json_obj)
print(py_dict['name'])
print(py_dict['age'])
print(py_dict['sex'])
py_lista = py_dict['a'] # 取出列表对象
print(py_lista)
py_listb = py_dict['b'] # 取出列表对象
print(py_listb)
# 读取JSON数据
with open('test.json', 'r') as f:
data = json.load(f)
print(data)
print(type(data)) # 转换成dict类型
介绍完毕。
转载:https://blog.csdn.net/qq_43157190/article/details/105640663