网络优化论文,网站排名优化怎么弄,网页版梦幻西游仙玉做什么划算,哪里网站建设好2019独角兽企业重金招聘Python工程师标准 寻觅工具 确定任务之后第一步就是找个趁手的库来干活。 Python Excel上列出了xlrd、xlwt、xlutils这几个包#xff0c;但是 它们都比较老#xff0c;xlwt甚至不支持07版以后的excel它们的文档不太友好#xff0c;都可… 2019独角兽企业重金招聘Python工程师标准 寻觅工具 确定任务之后第一步就是找个趁手的库来干活。 Python Excel上列出了xlrd、xlwt、xlutils这几个包但是 它们都比较老xlwt甚至不支持07版以后的excel它们的文档不太友好都可能需要去读源代码而老姐的任务比较紧加上我当时在期末没有这个时间细读源代码再一番搜索后我找到了openpyxl支持07的excel一直有人在维护文档清晰易读参照Tutorial和API文档很快就能上手就是它了~ 安装 这个很容易直接pip install openpyxl呵呵呵~ 因为我不需要处理图片就没有装pillow。 一些考虑 源文件大约一个在1~2MB左右比较小所以可以直接读入内存处理。既然是处理excel何况他们整个组显然都是win下干活数据都用excel存了 商科的人啊……这个脚本还是在win下做吧这个任务完全不需要我对现有的文件做修改囧……我只要读入、处理、再写出另一个文件就行了 学习使用 嗯就是打开cmd然后用python的shell各种玩这个模块来上手……win下没有装ipython囧 做这个小脚本基本上我只需要import两个东西 from openpyxl import Workbookfrom openpyxl import load_workbook load_workbook顾名思义是把文件导入到内存Workbook是最基本的一个类用来在内存里创建文件最后写进磁盘的。 干活 首先我需要导入这个文件 inwb load_workbook(filename) 得到的就是一个workbook对象 然后我需要创建一个新的文件 outwb Workbook() 接着在这个新文件里用create_sheet新建几个工作表比如 careerSheet outwb.create_sheet(0, career) 就会从头部插入一个叫career的工作表也就是说用法类似python list的insert 接下来我需要遍历输入文件的每个工作表并且按照表名做一些工作e.g.如果表名不是数字我不需要处理openpyxl支持用字典一样的方式通过表名获取工作表获取一个工作簿的表名的方法是get_sheet_names for sheetName in inwb.get_sheet_names(): if not sheetName.isdigit(): continuesheet inwb[sheetName] 得到工作表之后就是按列和行处理了。openpyxl会根据工作表里实际有数据的区域来确定行数和列数获取行和列的方法是sheet.rows和sheet.columns它们都可以像list一样用。比如如果我想跳过数据少于2列的表可以写 if len(sheet.columns) 2: continue 如果我想获取这个工作表的前两列可以写 colA, colB sheet.columns[:2] 除了用columns和rows来得到这个工作表的行列之外还可以用excel的单元格编码来获取一个区域比如 cells sheet[A1:B20] 有点像excel自己的函数可以拉出一块二维的区域~ 为了方便处理遇到一个没有C列的工作表我要创建一个和A列等长的空的C列出来那么我可以用sheet.cell这个方法通过传入单元格编号和添加空值来创建新列。 alen len(colA)for i in range(1, alen 1):sheet.cell(C%s % (i)).value None 注意excel的单元格命名是从1开始的~ 上面的代码也显示出来了获取单元格的值是用cell.value可以是左值也可以是右值它的类型可以是字符串、浮点数、整数、或者时间datetime.datetimeexcel文件里也会生成对应类型的数据。 得到每个单元格的值之后就可以进行操作了~openpyxl会自 动将字符串用unicode编码所以字符串都是unicode类型的。 除了逐个逐个单元格用cell.value修改值以外还可以一行行append到工作表里 sheet.append(strA, dateB, numC) 最后等新的文件写好直接用workbook.save保存就行 outwb.save(test.xlsx) 这个会覆盖当前已有的文件甚至你之前读取到内存的那个文件。 一些要注意的地方 如果要在遍历一列的每个单元格的时候获取当前单元格的在这个column对象里的下标for idx, cell in enumerate(colA): # do something...为了防止获取的数据两端有看不见的空格excel文件里很常见的坑记得strip()如果工作表里的单元格没有数据openpyxl会让它的值为None所以如果要基于单元格的值做处理不能预先假定它的类型最好用if not cell.value continue之类的语句来先行判断如果要处理的excel文件里有很多noise比如当你预期一个单元格是时间的时候有些表的数据可能是字符串这时候可以用if isinstance(cell.value, unicode): break之类的语句处理。win下的cmd似乎不太好设定用utf-8的code page如果是简体中文的话可以用936GBKprint的时候会自动从unicode转换到GBK输出到终端。 一些帮忙处理中文问题的小函数 我处理的表有一些超出GBK范围的字符当我需要把一些信息print出来监控处理进度的时候非常麻烦好在它们都是可以无视的我直接用空格替换再print也行所以加上一些我本来就要替换掉的分隔符我可以 # annoying seperatorsdot u\u00b7dash u\u2014emph u\u2022dot2 u\u2027seps (u., dot, dash, emph, dot2)def get_clean_ch_string(chstring): Remove annoying seperators from the Chinese string.Usage:cleanstring get_clean_ch_string(chstring) cleanstring chstring for sep in seps:cleanstring cleanstring.replace(sep, u ) return cleanstring 此外我还有一个需求是把英文名[空格]中文名分成英文姓、英文名、中文姓、中文名。 首先我需要能把英文和中文分割开我的办法是用正则匹配按照常见中英文字符在unicode的范围来套。匹配英文和中文的正则pattern如下 # regex pattern matching all ascii charactersasciiPattern ur[%s] % .join(chr(i) for i in range(32, 127))# regex pattern matching all common Chinese characters and seporatorschinesePattern ur[\u4e00-\u9fff. %s] % (.join(seps)) 英文就用ASCII可打印字符的范围替代常见中文字符的范围是\u4e00-\u9fff那个seps是前面提到过的超出GBK范围的一些字符。 除了简单的分割我还需要处理只有中文名没有英文名、只有英文名没有中文名等情况判断逻辑如下 def split_name(name): Split [English name, Chinese name].If one of them is missing, None will be returned instead.Usage:engName, chName split_name(name) matches re.match((%s) (%s) % (asciiPattern, chinesePattern), name) if matches: # English name Chinese namereturn matches.group(1).strip(), matches.group(2).strip() else:matches re.findall((%s) % (chinesePattern), name)matches .join(matches).strip() if matches: # Chinese name onlyreturn None, matches else: # English name onlymatches re.findall((%s) % (asciiPattern), name) return .join(matches).strip(), None 得到了中文名之后我需要分割成姓和名因为任务要求不需要把姓名分割得很明确我就按照常见的中文名姓名分割方式来分——两个字or三个字的第一个字是姓四个字的前两个字是姓名字带分隔符的少数民族名字分隔符前是姓这里用到了前面的get_clean_ch_string函数来移除分隔符名字再长一些又不带分割符的假设整个字符串都是名字。注意英语的first name 指的是名last name指的是姓2333 def split_ch_name(chName): Split the Chinese name into first name and last name.* If the name is XY or XYZ, X will be returned as the last name.* If the name is WXYZ, WX will be returned as the last name.* If the name is ...WXYZ, the whole name will be returnedas the last name.* If the name is ..ABC * XYZ..., the part before the seperatorwill be returned as the last name.Usage:chFirstName, chLastName split_ch_name(chName) if len(chName) 4: # XY or XYZchLastName chName[0]chFirstName chName[1:] elif len(chName) 4: # WXYZchLastName chName[:2]chFirstName chName[2:] else: # longercleanName get_clean_ch_string(chName)nameParts cleanName.split() print u .join(nameParts) if len(nameParts) 2: # ...WXYZreturn None, nameParts[0]chLastName, chFirstName nameParts[:2] # ..ABC * XYZ...return chFirstName, chLastName 转载于:https://my.oschina.net/u/2252538/blog/330467