python 实用编程技巧 —— 数据解析与构建相关问题与解决技巧
如何读写csv数据
csv 模块 reader 和 writer 对象读取和写入序列。程序员还可以使用 DictReader 和 DictWriter 类以字典形式读写数据。
该 csv 模块定义了以下功能
csv.
reader
(csvfile,dialect ='excel',** fmtparams )
- 返回一个读取器对象,它将迭代 csvfile 中的每行,以列表的形式呈现(里面的每个元素为字符串)
一个简单的用法案例:
1 2 3 4 5 | 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对象,负责将用户的数据转换为给定的类文件对象上的分隔字符串。
一个简单的用法案例
1 2 3 4 5 6 | 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
简单用法实例
1 2 3 4 5 | 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 的头
一个简短的用法实例
1 2 3 4 5 6 7 8 9 10 | 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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 组成
创建一个元素
1 2 3 4 5 6 | 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)) |
给一个元素添加子元素
1 2 3 4 5 6 7 | 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)) |
将一个已赋值的元素属性删除的方法
1 2 3 4 5 6 7 8 9 | 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格式的字符串写入文件中
1 2 3 4 5 6 7 8 | 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(读模式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 中写入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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' ) |
分类:
python 实用编程技巧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理