python 实用编程技巧 —— 数据解析与构建相关问题与解决技巧
如何读写csv数据
csv 模块 reader 和 writer 对象读取和写入序列。程序员还可以使用 DictReader 和 DictWriter 类以字典形式读写数据。
该 csv 模块定义了以下功能
csv.
reader
(csvfile,dialect ='excel',** fmtparams )
- 返回一个读取器对象,它将迭代 csvfile 中的每行,以列表的形式呈现(里面的每个元素为字符串)
一个简单的用法案例:
import csv with open('eggs.csv', 'r') as csvfile: spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') for row in spamreader: print(', '.join(row))
csv.
writer
(csvfile,dialect ='excel',** fmtparams )
- 返回一个writer对象,负责将用户的数据转换为给定的类文件对象上的分隔字符串。
一个简单的用法案例
import csv with open('eggs.csv', 'wb') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
csv.
DictReader
(f,fieldnames = None,restkey = None,restval = None,dialect ='excel',* args,** kwds )
- 创建一个像常规阅读器一样操作的对象,但将读取的信息映射到一个dict
简单用法实例
import csv with open('ceshi.csv') as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row['name'], row['age'])
csv.
DictWriter
(f,fieldnames,restval ='',extrasaction ='raise',dialect ='excel',* args,** kwds )
- 创建一个像常规编写器一样操作的对象,但将字典映射到输出行。如果字典缺少字段名中的键,则可选的restval参数指定要写入的值
- fieldnames 起到约束的作用,指定 csv 的头
一个简短的用法实例
import csv with open('names.csv', 'w') as csvfile: fieldnames = ['first_name1', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
支持以下属性
Dialect.
delimiter:
用于分隔字段的单字符字符串。它默认为','
- Dialect.lineterminator: 用于终止由生成的行的字符串 wrinter, 它默认为
'\r\n'
Dialect.
skipinitialspace:
True
,忽略分隔符后面的空格。默认是False
公共方法:
csvwriter.
writerow
(行)
- 将row参数写入writer的文件对象,根据当前方言进行格式化
csvwriter.
writerows
(行)
- 将行中的所有元素(如上所述的行对象的可迭代)写入编写器的文件对象,根据当前方言进行格式化
读写csv文件
import csv headers = ['name', 'age', 'six'] data = [ ('张三', '21', '男'), ('张四', '22', '男') ] with open('ceshi.csv', 'w', encoding='gbk') as f: writer = csv.writer(f, delimiter=',') writer.writerow(headers) for i in data: writer.writerow(i) with open('ceshi.csv','r', encoding='gbk') as f: reader = csv.reader(f) next(reader) for book in reader: print(book)
如何解析简单的xml文档
from xml.etree import ElementTree # 从字符串中解析 ElementTree.fromstring('相应字符串') # 从文件中解析 et = ElementTree.parse('demo.xml') root = et.getroot() # 获取根元素 data root.tag # 当前tag data c1 = list(root)[0] # 获取子元素列表 c1为列表中第一个 country c1.attrib # {'name': "Liechtenstein"} attrib获取属性字典 c1.get('name') # Liechtenstein year = list(c1)[1] year.text # 得到year标签里的 2008 year.tail # '\n\t\t' 即 year标签与下一个标签 之间的 字符 c1.find('neighbor') # 在子元素中 找到 第一个neighbor标签 c1.findall('neighbor') # 在子元素中 找到 所有neighbor标签 得到 列表 list(root.iter('neighbor')) # 找到所有neighbor # root.iter() 没有传入参数 则返回所有 元素 list[root.iterfind('./*/*[@name]')] # 使用xpath 表达式 查找 list(c1.itertext()) # 获取所有 text文本 包括 \n\t # 过滤掉\n\t ' '.join(t for t in c1.itertext() if not t.isspace())
如何构建xml文档
Element 是节点元素
ElementTree是由 Element 组成
创建一个元素
from xml.etree.ElementTree import Element,ElementTree e = Element("Data") #创建一个元素,传入一个字符串 <Data>是head的名字 e.set('name','abc') #设备这个元素的属性,get获取属性,set设置属性。属性为’name’值 是abc from xml.etree.ElementTree import tostring #显示成为XML元素后转成了字符串 e.text = '123' print(tostring(e))
给一个元素添加子元素
from xml.etree.ElementTree import Element,ElementTree e2 = Element('Row') e3 = Element('Open') e3.text = '8.80' e2.append(e3) from xml.etree.ElementTree import tostring #显示成为XML元素后转成了字符串 print(tostring(e2))
将一个已赋值的元素属性删除的方法
from xml.etree.ElementTree import Element,ElementTree e2 = Element('Row') e3 = Element('Open') e3.text = '8.80' e2.append(e3) from xml.etree.ElementTree import tostring #显示成为XML元素后转成了字符串 print(tostring(e2)) e3.text = None # 删除 e3 中的内容 print(tostring(e2))
将XML格式的字符串写入文件中
from xml.etree.ElementTree import Element,ElementTree e2 = Element('Row') e3 = Element('Open') e3.text = '8.80' e2.append(e3) e3.text = None # 删除 e3 中的内容 et = ElementTree(e2) et.write('ha.xml')
如何读写excel文件
打开一个excel(读模式)
import xlrd, xlwt rbook = xlrd.open_workbook('demo.xlsx') # 打开excel文件 # 获取所有的 表 rbook.sheets() 一个excel文件 是有多个表构成的 即sheet 可以在文件底边看到当前是哪张表 rsheet = rbook.sheet_by_index(0) # 第一张表 k = rsheet.ncols # ncols 列 nrows 行 # 常用用法 c00 = rsheet.cell(0,0) 获取0行 0列的 数据 是cell对象 c00.ctype 得到1 即xlrd.XL_CELL_TEXT 文本类型 还有其他的类型 如数字 type为 2 xlrd.XL_CELL_NUMBER c00.value 得到内容 ‘姓名’ # rsheet.cell_value(0,0) 直接取到值 # 取整行 rsheet.row(0) 得到 [text:'姓名', text:'语文 , text:'数学', text:'英语'] rsheet.row_values(0) 得到 ['姓名', '语文 , '数学', '英语'] #第一个参数:第几行 第二个参数:从该行第几列开始取 第三个参数: 结束列,默认为 直到结束, # 取列的方法 与取行 类似 rsheet.row_values(1, 1) 得到 [95, 99, 96]
往 excel 中写入数据
import xlrd, xlwt rbook = xlrd.open_workbook('demo.xlsx') # 打开excel文件 # 获取所有的 表 rbook.sheets() 一个excel文件 是有多个表构成的 即sheet 可以在文件底边看到当前是哪张表 rsheet = rbook.sheet_by_index(0) # 第一张表 k = rsheet.ncols # ncols 列 nrows 行 rsheet.put_cell(0, k, xlrd.XL_CELL_TEXT, '总分', None) # 放置一个单元格,内容格式是文本,内容是总分 for i in range(1, rsheet.nrows): t = sum(rsheet.row_values(i, 1)) # 算总分 rsheet.put_cell(i, k, xlrd.XL_CELL_NUMBER, t, None) wbook = xlwt.Workbook() wsheet = wbook.add_sheet(rsheet.name) # 表名不变 # 将原来的分数 和新添加的 总分 保存在新的excel文件中 for i in range(rsheet.nrows): for j in range(rsheet.ncols): wsheet.write(i, j, rsheet.cell_value(i, j)) wbook.save('out.xlsx')