
现有 sample.txt 内文件内容如下:
一级学科代码及名称:0101 哲学 本一级学科中,全国具有“博士授权”的高校共 48 所,本次参评 38 所;部分具有“硕士授权”的高校也参加了评估;参评高校共计 84 所(注:评估结果相同的高校排序不分先后,按学校代码排列)。 评估结果 学校代码及名称 A+ 10001 北京大学 10246 复旦大学 A 10002 中国人民大学 10284 南京大学 A- 10027 北京师范大学 10183 吉林大学 10486 武汉大学 10558 中山大学 B+ 10003 清华大学 10055 南开大学 10212 黑龙江大学 10269 华东师范大学 10286 东南大学 10335 浙江大学 10422 山东大学 10487 华中科技大学 B 10052 中央民族大学 10108 山西大学 10145 东北大学 10247 同济大学 10319 南京师范大学 10384 厦门大学 10542 湖南师范大学 10610 四川大学 10718 陕西师范大学 B- 10140 辽宁大学 10141 大连理工大学 10270 上海师范大学 10285 苏州大学 10533 中南大学 10574 华南师范大学 10635 西南大学 10698 西安交通大学 C+ 10053 中国政法大学 10075 河北大学 10357 安徽大学 10385 华侨大学 10403 南昌大学 10475 河南大学 10512 湖北大学 10520 中南财经政法大学 10730 兰州大学 C 10203 吉林师范大学 10280 上海大学 10531 吉首大学 10590 深圳大学 10656 西南民族大学 10673 云南大学 评估结果 学校代码及名称 C 10674 昆明理工大学 10726 西北政法大学 C- 10094 河北师范大学 10166 沈阳师范大学 10370 安徽师范大学 10476 河南师范大学 10593 广西大学 10636 四川师范大学 10652 西南政法大学 10681 云南师范大学 希望能够把结果输出为形如如下的结构(最后打算输出 csv 格式的数据):
header = [学校,A+,A,A-,B+,B,B-,C+,C,C-] row= [(北京大学,哲学,,,,,,,,) (云南师范大学,,,,,,,,哲学)] 还是 python 的新手,想了很久不知道该怎么处理。求诸位 V2EXer 可以指点一下思路。
1 u1ucky 2017-12-30 11:48:13 +08:00 可以用 enumerate 逐行遍历,处理结果放到两个数组里。 |
2 czb 2017-12-30 11:52:46 +08:00 via Android With open .. as file For line in file Regex |
3 Universe 2017-12-30 13:54:39 +08:00 ``` { "学校名称": [[A+学科名称列表],[A 学科名称列表]...], "学校名称": [[A+学科名称列表],[A 学科名称列表]]... } ``` |
7 yangyaofei 2017-12-30 16:01:27 +08:00 via Android 你需要正则表达式 |
8 anguslg 2017-12-30 16:14:30 +08:00 这种数据也要事先人工清洗一遍成代码易读的才行, 然后用 pandas 会方便很多 |
9 SakuraSa 2017-12-30 17:07:29 +08:00 虽然出来的数据格式不太对,但是应该很好转换过去了 https://gist.github.com/anonymous/c5c24ec12ee98f55030c7c70680a8911 |
10 jpmorn 2017-12-30 17:09:50 +08:00 awesome-wechat-jump :) |
11 SakuraSa 2017-12-30 17:25:43 +08:00 上面的那个 gist 被我不小心删掉了,换一个 |
12 SakuraSa 2017-12-30 17:25:49 +08:00 |
13 omph 2017-12-30 18:10:21 +08:00 鉴于数据比较整洁,分析过程可以用流式分析法: 1. 记录分割:先把文本按字符串“一级学科代码及名称:”分割( split ),得到不同学科的数据。每段再按空白分割。 2. 分析和归类:遇到“ A+”等,记录,遇到以“大学”结尾,存储。数据结构用 3 楼的思路 3. 整理数据为最终格式 |
14 5mins 2017-12-30 18:24:02 +08:00 如果不嫌弃正则慢,可以用正则,但正则是最烦人的,因为各个版本各种语言都有差别。 楼上 SakuraSa 的代码已经不错了,但看了下正则写得有点问题,会导致丢失数据。 可以试下替换成这两条: ```python ([A-E][+|-]?)[^A-E]* ([0-9]{5}) *([\u4e00-\u9fa5]+)[^0-9] ``` 只在在线的正则表达式的网站测试过。  |