1 csv文件
1 cvs简介
CSV 全称 Comma-Separated Values,中文叫逗号分隔值或字符分隔值,它以纯文本形式存储表格数据(数字和文本),其本质就是一个字符序列,可以由任意数目的记录组成,记录之间以某种换行符分隔,每条记录由字段组成,通常所有记录具有完全相同的字段序列,字段间常用逗号或制表符进行分隔。CSV 文件格式简单、通用,在现实中有着广泛的应用,其中使用最多的是在程序之间转移表格数据。
2 读reader
csv.reader(csvfile, dialect=’excel’, **fmtparams):用于文件的读取, 返回一个reader 对象,
csvfile:文件对象或者list对象,如果 csvfile 是文件对象,则使用 newline=’’ 打开,:with open(‘eggs.csv’, newline=’’) as csvfile
dialect :用于指定csv的格式模式不同程序输出的csv格式有细微差别;dialect 描述,只读,供 writer 使用
fmtparams:是一系列参数列表,主要用于设置特定的格式,以覆盖dialect中的格式。
Reader对象的公共属性:
csvreader.dialect #返回其dialect
csvreader.line_num #返回读入的行数
import csv
with open('testtry.csv',newline='') as rf:
csv_reader = csv.reader(rf) #创建csv.reader对象
for row in csv_reader:
#读取出的内容是列表格式的
print(row)
2 写writer
csv.writer(csvfile, dialect=’excel’, **fmtparams):返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。
writer对象的方法:
csvwriter.writerow(row) #写入一行数据
csvwriter.writerows(rows) #写入多行数据
writer对象的属性:
csvwriter.dialect #属性,返回dialect
分开写的方式
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 导入CSV安装包
import csv
# 1. 创建文件对象
wf = open('文件名.csv','w',encoding='utf-8')
# 2. 基于文件对象构建 csv写入对象
csv_writer = csv.writer(wf)
# 3. 构建列表头
csv_writer.writerow(["姓名","年龄","性别"])
# 4. 写入csv文件内容
csv_writer.writerow(["l",'18','男'])
csv_writer.writerow(["c",'20','男'])
csv_writer.writerow(["w",'22','女'])
# 5. 关闭文件
f.close()
合并写的方式
with open('testtry.csv', 'w', newline='') as wf: # csv文件原来存在的话,会覆盖点原来文件的内容
csv_writer = csv.writer(wf) #创建一个写对象
csv_writer.writerow(["l",'18','男']) #写入一行
data = [( "c",'20','男'), ("c",'20','男')]
csv_writer.writerows(data) # 写入多行
3 字典形式读DictReader
class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect=’excel’, args, *kwds):其中,csvfile是文件对象或list对象;fieldnames用于指定字段名,如果没有指定,则第一行为字段名;restkey和restval用于指定字段名和数据个数不一致时所对应的字段名或数据值,其他参数同reader对象。
# 属性:
csvreader.dialect # 解析器使用的方言的只读描述。
csvreader.line_num #返回读入的行数
csvreader.fieldnames #返回标题字段名
文件names.csv为下一章节写入的。
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['first_name'], row['last_name'])
print('fieldnames:',reader.fieldnames) # 读取标题字段,如果没有,则会读取文件的第一条记录
print('dialect:',reader.dialect) #解析器使用的方言的只读描述。
print('line_num:',reader.line_num) # 返回读入的行数
print(row) # 字典
4 字典形式写DictWriter
class csv.DictWriter(f, fieldnames, restval=’’, extrasaction=’raise’, dialect=’excel’, args, *kwds) :extrasaction用于指定多余字段时的操作,其他参数同DictReader
fieldnames :一个字典keys的序列,用于标识writerow()方法传递字典中的值的顺序
restval :可选参数,用于字典在字段名中确实键时要写入的值
extrasaction :如果一个字典传递给writerow()方法在fieldnames中找不到键,extrasaction指示要采取的操作,
如果设置:’raise’ (默认值), ValueError is raised【ValueError :当操作或函数接收到具有正确类型但不适当值的参数时引发,并且这种情况不会由更精确的异常(如IndexError)来描述】
如果设置:‘’ignore’’ ,忽略字典中的额外值
with open('names.csv', 'w', newline='') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader() # 写入标题字段名
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) #写入一行
rowdict =[{'first_name': 'Lovely', 'last_name': 'Spam'},{'first_name': 'Wonderful', 'last_name': 'Spam'}]
writer.writerows(rowdict) #写入多行
csv.DictWriter
5 写读追加状态
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+
6 其它实例
1 读写操作
作用:读写书籍,注意next的操作(下文reader是一个迭代器)。判断书价格在80以上的写入到新的csv中。
2 csv并行查看两条数据
参考:https://docs.python.org/zh-cn/3/library/csv.html
2 json文件
json转成其它
import json
help(json.loads)
import requests
r = requests.get('http://httpbin.org/headers')
r.content #b'{\n "headers": {\n "Accept": "*/*", \n "Accept-Encoding ...
r.text #'{\n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate, b
d = json.loads(r.text)
d
# {'headers': {'Accept': '*/*',
# 'Accept-Encoding': 'gzip, deflate, br',
# 'Host': 'httpbin.org',
# 'User-Agent': 'python-requests/2.26.0',
# 'X-Amzn-Trace-Id': 'Root=1-616d72d2-4cb4340c0520dafa34363c1d'}}
转成json文件
json_ = json.dumps(d)
json_ #'{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate
3 xml文件
读xml
假设xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<Managers address="科技软件园" company="xx科技">
<Manager>
<name>joy</name>
<age>27</age>
<sex>女</sex>
</Manager>
<Manager>
<name>tom</name>
<age>30</age>
<sex>男</sex>
</Manager>
<Manager>
<name>ruby</name>
<age>29</age>
<sex>女</sex>
</Manager>
</Managers>
加载,使用xml.etree.ElementTree,从名称和上面的结构可以看出。xml是一个树形结构特征的数据。
from xml.etree import ElementTree
ElementTree.parse('test.xml') #等效于 ElementTree.parse('test.xml')
#若是字符串使用 ElementTree.Fromstring
et = ElementTree.parse('test.xml')
root = et.getroot()
root #<Element 'Managers' at 0x7f9dfe846a70>
获得属性值
root.attrib #{'address': '科技软件园', 'company': 'xx科技'}
得到所有元素头部下信息
c1 = list(root)
c1
# [<Element 'Manager' at 0x7f9dfe846b30>,
# <Element 'Manager' at 0x7f9dfe846d10>,
# <Element 'Manager' at 0x7f9dfe846e90>] '
获取内容
c1[0].text #'\n '
c1[0].tail #'\n '
c2 = list(c1[0])[0]
c2.text #'joy'
查找
c1[0].find('name') #<Element 'name' at 0x7f9dfe846bf0>
c1[0].findall('name')
list(root.iter('age'))
# [<Element 'age' at 0x7f9dfe846c50>,
# <Element 'age' at 0x7f9dfe846dd0>,
# <Element 'age' at 0x7f9dfe846f50>]
list(root.iter()) # 查找所有
# [<Element 'Managers' at 0x7f9dfe846a70>,
# <Element 'Manager' at 0x7f9dfe846b30>,
# <Element 'name' at 0x7f9dfe846bf0>,
# <Element 'age' at 0x7f9dfe846c50>,
# <Element 'sex' at 0x7f9dfe846cb0>,
# <Element 'Manager' at 0x7f9dfe846d10>,
# <Element 'name' at 0x7f9dfe846d70>,
# <Element 'age' at 0x7f9dfe846dd0>,
# <Element 'sex' at 0x7f9dfe846e30>,
# <Element 'Manager' at 0x7f9dfe846e90>,
# <Element 'name' at 0x7f9dfe846ef0>,
# <Element 'age' at 0x7f9dfe846f50>,
# <Element 'sex' at 0x7f9dfe846fb0>]
写xml
使用标准库中的xml.etree.ElementTree,构建ElementTree,然后调用write方法
方法1:
import xml.etree.ElementTree as ET
data = ET.Element('Data')
book = ET.Element("Book")
auther = ET.Element('作者')
book.set('x', 'abc') # 设置属性
auther.text = 'yifan'
data.append(book) # book作为data的儿子
book.append(auther)
ET.dump(data)
方法2:(通常使用该方法)
data = ET.Element('Data')
book = ET.SubElement(data,'Book')
book.set('x', 'abc')
auther = ET.SubElement(book,'作者')
auther.text = 'yifan'
ET.dump(data)
写入
et = ET.ElementTree(data)
et #<xml.etree.ElementTree.ElementTree at 0x7f9dfe8383d0>
et.write('test_.xml', encoding='utf8')
cat test_.xml
# <?xml version='1.0' encoding='utf8'?>
# <Data><Book x="abc"><作者>yifan</作者></Book></Data>
csv写成一个xml实例
csv:
import csv
from xml.etree.ElementTree import ElementTree, Element, SubElement
def csv_to_xml(csv_path, xml_path):
with open(csv_path) as f:
reader = csv.reader(f)
headers = next(reader)
root = Element('Data')
root.text = '\n\t'
root.tail = '\n'
for row in reader:
book = SubElement(root, 'Book')
book.text = '\n\t\t'
book.tail = '\n\t'
for tag, text in zip(headers, row):
e = SubElement(book, tag)
e.text = text
e.tail = '\n\t\t'
e.tail = '\n\t'
book.tail = '\n'
ElementTree(root).write(xml_path, encoding='utf8')
csv_to_xml('book.csv', 'book.xml')
结果:
<?xml version='1.0' encoding='utf8'?>
<Data>
<Book>
<书名>c</书名>
<作者>yifan</作者>
<出版社>北航</出版社>
<出版日期>2021/3</出版日期>
<价格>98</价格>
</Book>
<Book>
<书名>c++</书名>
<作者>yifan</作者>
<出版社>北航</出版社>
<出版日期>2021/3</出版日期>
<价格>98</价格>
</Book>
<Book>
<书名>python</书名>
<作者>yifan</作者>
<出版社>北航</出版社>
<出版日期>2021/3</出版日期>
<价格>98</价格>
</Book>
</Data>
4 python对Excel
数据的保存
# Author:yifan
import xlwt
namelist = [1, 1, 1, 1, 1]
listy = [2, 2, 2, 2, 2]
f = xlwt.Workbook() # 创建工作薄
sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True) # 创建sheet
j = 0
for i in namelist:
sheet1.write(j, 0, i) # 循环写入第一列
j = j + 1
k = 0
for i in listy:
sheet1.write(k, 1, i) # 循环写入第二列
k = k + 1
f.save('D:/excelText.xls')
2 读取数据
import xlrd
workbook = xlrd.open_workbook(r'D:\excelText.xls') #打开excel文件
worksheet=workbook.sheet_by_index(0)#取第一张表
listname = [0]*worksheet.nrows
listy = [0]*worksheet.nrows
for i in range(worksheet.nrows):
listname[i]=worksheet.cell_value(i,0)
listy[i]=worksheet.cell_value(i,1)
print(listname)
使用xlsxwriter
import xlsxwriter
workbook = xlsxwriter.Workbook(f'{model_test_home}/{test_day}_test.xlsx')
title = ['省市名称','总数','test','11111111111111','2222222']
worksheet = workbook.add_worksheet()
for t in range(len(title)):
worksheet.write(0,t,title[t])
workbook.close()
其它样式请看:
https://blog.csdn.net/qq_40676033/article/details/86555425
5 txt文件
读文件
写文件
list数据写入文本中保存:
def write_data(data,file_name_or_path):
with open(file_name_or_path,'w',encoding= 'utf-8') as f:
for sente in data:
f.write(sente)
print('write done!')