python实践编程

上一篇文章说了我是怎么开始学习python的,这里要说的就是我开始我的第一个使用python来处理xls文件的小项目,在这个过程中我学到了哪些以及后面怎么继续学习python。在这篇文章之前,需要看过前面的《简明python教程》。

目标功能

$1 自动根据xls文件的标题行识别表单是否符合条件

$2 分离符合条件的表单为单独文件

$3 处理符合条件的xls文件,自动识别标题行

$4 获取对应标题列数据,写入指定表单

实现过程&解决问题

模块安装

首先,下载xlwt,xlrd和xlutils三个模块安装,所以这里就有一个安装模块的问题。通过在网上搜索之后然后在python官网找到下载的链接,将文件下载下来,然后就是安装。下载下来的包解压之后就会有一个setup.py,然后使用

#python setup.py install

安装即可。其实这里安装的过程:

setup函数里做的大部分是设置描述性东西,比如name、version等,最主要的是packages参数,最后做的就是将文件复制到python的模块搜索路径下

这里涉及到python的模块搜索路径的问题。使用import指令导入模块,python解释器就会在当前目录下寻找[模块名].py的文件,然后再从环境变量PYTHONPATH寻找,如果这个环境变量没有设定,解释器还会在安装预先设定的的一些目录寻找,标准模块就是放在这些预设的目录。搜索的目录是可以在运行时动态改变的,比如将module.py不放在当前目录,而放在一个冷僻的角落里。就需要通过某种途径,如sys.path,来告知Python。sys.path返回的是模块搜索列表,然后通过使用list的append()或insert()将我们自己的路径添加进去。

$1

第一个功能是“自动根据xls文件的标题行识别表单是否符合条件”,思路是这样的:

载入自定义的标题存储为一个list,sheet表单的前面maxline行,将每一行的所有列标题分别串联成一个长的字符串strs,将标题字典中的标题使用find函数在strs中搜索字串,满足某些字典中的标题条件即可视为改行为这个表单的标题行,返回行号;如果在maxline中找不到符合条件的标题行返回-1

这里又引出了一个问题:如何载入文件然后转换为list? 我找到这样一篇参考文章 文本处理,然后根据自定义字典文件时使用的分隔符,通过字符串的split函数分隔每一个元素。

$2

第二个功能是“分离符合条件的表单为单独文件”,思路是这样的:

前面一个功能实现了标题识别,通过这一个就可以判定一个表单是否符合条件。因为一个表格文件包含很多个表单,一个表格文件中可能有部分表单符合要求,部分不符合要求,因此当一个表格文件符合这个情况时,需要分离每一个符合条件的表单到一个个单独的文件。至于分离的表单的数据,复制过来即可。在这里的问题是文件的命名,一个比个文件中的所有表单的名字都不会相同,因此我使用hash函数对表格文件名进行hash得到的hash字符串连接上表单的名字作为分离出来的文件名,可以有效防止文件名重复的问题。

这里又有一个问题:hash函数由哪个模块提供?

答案是:hashlib,通过import hashlib然后直接使用hash函数即可,这是python自带的一个标准库。

$3

第三个功能是"处理符合条件的xls文件,自动识别标题行",思路是这样的:

在第二个功能中,我们已经将符合条件的xls文件筛选出来了,在这个功能中我们集中精力解决标题识别的问题。先将我们自定义的标题和这个标题的拓展以key:value的形式写在字典文件中,在这个字典文件中,每一个key:value占一行。比如,

***号码:***号码,公民***号码,公民身份号码,身分证号码,公民身分证号码,公民身分号码

通过载入字典文件,将key:value对应建立列标题识别字典。对于一个列标题,比如"公民***号码",将"公民***号码"这个列标题遍历字典的所有value,方法是:

对于每一个字典中的value字符串使用find方法查找子串“公民***号码”,然后在value为"***号码,公民***号码,公民身份号码,身分证号码,公民身分证号码,公民身分号码"的find函数中,由于匹配到,所以会返回子串的位置,即返回大于等于0的值,通过这个返回值就可以判断是否匹配到该子串,即是识别出该列标题为"***号码",然后返回value对应的key,即"***号码"。

识别到这一列的列标题后,说明这一列的数据是我们需要提取的,这个时候我需要想一个办法记录好识别出来的这一列标题。这里我构建一个源文件字典,列标题识别函数识别出来的某一列后,将这一列的列号作为key,将列标题识别函数识别出来的key作为value。

$4

第四个功能是"获取对应标题列数据,写入指定表单",思路是这样的:

写入的格式是一定的,这个格式通过写入字典规定。写入字典的key是标题,这个标题和前面的列标题识别字典文件中key:value中的key一致。比如说,列标题识别字典有一行是“***号码:***号码,公民***号码,公民身份号码,身分证号码,公民身分证号码,公民身分号码”,那么写入字典这里也会有一行的key是“***号码”。写入字典的每个key对应的value是要写入表单的列的列号,由于表单是写入信息的表单的那一列对应那个列标题的数据是,所以这里的列号是自己分配的。必须再次提醒的是,写入字典的key必须和列标题识别字典的key完全一致对应,否则就会出现识别出来的列的数据不需要保存,这不符合我们提取信息的初衷。

识别完列标题就建立好了前面说的源文件字典,然后通过写入字典就可以找到写入的位置。从识别出来的标题行的下一行开始,通过源文件字典的has_key(列号)函数来查看源文件字典中是否记录有这一列,是即表明这一列的数据是我们要提取的,然后将该列号作为源文件字典的key查找到value,将这个value作为写入字典的key即可查找出对应写入的列号;如果has_key(列号)函数来查看源文件字典中没有记录这一列,表明这一列的数据不是我们要提取的,跳过,继续下一列。

编码问题

一个是python源文件的编码,一个是string类型的编码。python默认是以ASCII来处理py源文件的,如果py源文件中含有中文等注释的话,在编译的时候会报错,要解决这个问题就需要显示指定源文件的编码,如显式指定为utf8的编码,需要在py源文件的第一或第二行加上这一句:

#conding=utf8

以上解决了py源文件的编码的问题,但是使用到字符串函数时,如果字符串中含有中文,结果并不能如我们所愿,这个就涉及到字符串的编码的问题。因为string类型默认也是ASCII,因此需要使用下面的语句来改变string的编码。

import sys

reload(sys)

sys.setdefaultencoding(‘utf8′)

用到的xlwt,xlrd,xlutils中的函数

xlwt

import xlwt

#创建一个文件

workbook = xlwt.Workbook(encoding=‘utf-8‘)

#增加一个表单

booksheet = workbook.add_sheet(‘Sheet 1‘)

如果对一个单元格重复操作,会引发

returns error: # Exception: Attempt to overwrite cell: # sheetname=u‘sheet 1‘ rowx=0 colx=0

所以在打开时加cell_overwrite_ok=True解决

booksheet = workbook.add_sheet(‘Sheet 1‘,cell_overwrite_ok=True)

重新写入新数据,再保存时,却丢失了之前的格式(比如原来的是粗体,保存之后没了),在用xlrd.open_workbook时,添加对应的参数formatting_info=True,就可以保留原有格式了。

booksheet = workbook.add_sheet(‘Sheet 1‘,cell_overwrite_ok=True,formatting_info=True)

#增加一行

row = booksheet.row(i)

#增加一列

col = booksheet.col(j)

#为某个单元格赋值

booksheet.write(i, j, ‘Test‘)

row.write(j, ‘Test‘)

col.write(i, ‘Test‘)

xlrd

import xlrd

#获取一个文件

workbook = xlrd.open_workbook(‘成绩单.xls‘)

#获取文件中表单数量

workbook.nsheets

#获取一个表单

workbook.sheets()[i],

workbook.sheet_by_index(i)

workbook.sheet_by_name(u‘Sheet1‘)

#获取行,列数

sheet.nrows, sheet.ncols

#获取整行,列数据

sheet.row(i), sheet.col(j)

#获取某个单元格数据

sheet.cell(i, j).value

sheet.row(i)[j].value

sheet.col(j)[i].value

xlutils

import xlutils.copy from copy

时间: 2024-08-04 20:28:26

python实践编程的相关文章

Python多核编程mpi4py实践

Python多核编程mpi4py实践 [email protected] http://blog.csdn.net/zouxy09 一.概述 CPU从三十多年前的8086,到十年前的奔腾,再到当下的多核i7.一开始,以单核cpu的主频为目标,架构的改良和集成电路工艺的进步使得cpu的性能高速上升,单核cpu的主频从老爷车的MHz阶段一度接近4GHz高地.然而,也因为工艺和功耗等的限制,单核cpu遇到了人生的天花板,急需转换思维,以满足无止境的性能需求.多核cpu在此登上历史舞台.给你的老爷车多加

python高级编程之最佳实践,描述符与属性01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的问题,必须考虑到几下几点: ~1:应该避免多重继承,可以一些设计模式来代替它 ~2:super使用必须一致,在类层次结构中,应该在所有地方都使用super或者彻底不使用它,滥用super和传统调用是一种滥用方法,建议使用super ~3:不要滥用经典类和新式类,两者都具备代码库将导致不同的mro表现 ~4:调

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

Python核心编程(第二版) 第四章习题答案

4-1.Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下.答:与所有Python对象有关的三个属性是身份.类型.值.身份:每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到.这个值可以被认为是该对象的内存地址.类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么规则.可以用内建函数type()来查看Python的类型.值:对象表示的数据项.4-2.类型.不可更改(immutable)指的是什么?Pyth

Python黑客编程入门教程

我真正开始学习Python是从今年4月份看到2017年的国赛试题之后,之前虽也零星接触过,但都只是皮毛,所以对于我,必须要借助这样一些目标的驱动,才有动力或压力去深入学习下去,这也是我坚持带比赛的一个主要原因. 这套教程是在7月份暑假集训期间录制的,所以从我开始学习Python到录制教程前后也就3个多月的时间,因而教程的内容肯定是相对比较粗糙的.之所以要这么赶,主要是必须要在暑假集训期间让这批准备参加11月份省赛的同学能对Python入门,省赛要跟国赛走,而Python必定是今年省赛的重点.还有

python高级编程之访问超类中的方法:super()

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #超类01 #它是一个内建类型,用于访问属于某个对象超类特性 print super#<type 'super'> #如果已习惯于通过直接调用父类将self作为第一参数来访问的特性,可能会出现混乱 #经典方法 class M(object): def s(self): print u'不是超类方法' class S(M): def s(self): M.s(sel

python核心编程第二版

初学Python这是一本有关Python开发的指南涵盖近期发布的Pyttlon版本的核心功能特性,而不仅仅是语法学习更多的高阶内容,如正则表达式.网络.多线程.图形用户界面.Web/CGl和Python扩展等包括几个全新的章节,关于数据库.网络客户端.Java/Jytt30n和Microsoft Office等 展示数以百计的代码片段.交互实例和大量加强您的Python技能的实用练习"对Wesley Chun<Python核心编程>第二版的漫长等待是值得的--它的深邃.它的全面,以及

python网络编程,通过服务名称和会话类型(tcp,udp)获取端口号,简单的异常处理

作为一个php程序员,同时有对网络方面感兴趣,php就比较蛋疼了,所以就抽了些时间看python 之前学python基础因为工作原因,断断续续的看了个基础,差不多是可以写代码了 最近在看<python网络编程基础>,准备是边实践边学习了,对书上的一个例子做了个复制 cli下运行的代码 1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # ^设置编码:代码中有中午会导致编译错误 4 5 # 引入socket,sys模块 6 import so

Python计算机视觉编程pdf

下载地址:网盘下载 内容简介  · · · · · · <python计算机视觉编程>是计算机视觉编程的权威实践指南,依赖python语言讲解了基础理论与算法,并通过大量示例细致分析了对象识别.基于内容的图像搜索.光学字符识别.光流法.跟踪.三维重建.立体成像.增强现实.姿态估计.全景创建.图像分割.降噪.图像分组等技术.另外,书中附带的练习还能让读者巩固并学会应用编程知识. <python计算机视觉编程>适合的读者是:有一定编程与数学基础,想要了解计算机视觉的基本理论与算法的学生