mya \祝你今" />

小言_互联网的博客

Python 数据交换格式 csv,xml,json

409人阅读  评论(0)

假设现在有一张便条:

  • 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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场