Python一些可能用的到的函数系列28 超大文本文件分割读取
说明
有时候会有一些特别大的文本文件需要拆分处理
内容
1 曾经用过的笨办法
1.1 读取大文件的末尾n行
# 采用偏置方法读取末尾三百行文本
def read_tail_n(fname, n_lines):off = - 100 # 偏置量min_size = - os.path.getsize(fname) # 最小量with open(fname,'rb+') as f:while True:if off < min_size:f.seek(min_size, 2)res_lines = f.readlines()breakf.seek(off, 2) # 2 代表文件末尾,往回追 off个字符lines= f.readlines()if len(lines) > n_lines + 1:res_lines = lines[-n_lines:]breakoff *= 2return res_lines
1.2 读取某些行进入内存
def read_somelines_mem(filename, start_line = 1 , end_line = 100):f = open(filename, 'r')line_count = 0start_line -= 1 # 和数组索引对齐lines = []for i in range(end_line): # 从头开始循环line = f.readline()if line_count >= start_line:lines.append(line)line_count +=1 # line_count是行指针f.close()return lines
1.3 计算文件的行数
# 读取大文件行数def nrow_big_txt(filename):cnt = 0with open(filename,'r') as f:for line in f:cnt+=1print('total lines: %s' % cnt)return cnt
2 新办法
使用os包调用linux的命令。
2.1 head
import os
def get_head_lines(fpath, line_num,is_line = False):cmd1 = ''' head -n %s %s''' % (line_num, fpath)res = os.popen(cmd1).read()if is_line:# 最后一行是空的,多出来的res = res.split('\n')[:-1]return res
get_head_lines('./xxx股票招股说明书.txt', 20)' \n \n \n股份有限公司 \nYes Optoelectronics CO., LTD. \n辽宁省路 288 号 \n \n \n \n首次公开发行股票招股说明书 \n \n \n \n保荐人(主承销商) \n \n(住所:深 111号) \n \n \n \n \n'
2.2 sed
获取文件的中间n行
import os
# 获取大文本的中间n行(左闭右开)。is_line=True会根据换行符\n分行,否则就不分
def get_lines_txtfile(fpath, start_line, end_line, is_line = False):# sed命令会取到右边end_line -=1cmd1 = '''sed -n '%s,%sp' %s ''' % (start_line, end_line, fpath)res = os.popen(cmd1).read()if is_line:# 最后一行是空的,多出来的res = res.split('\n')[:-1]return res
---
第200行:
get_lines_txtfile('./xxx股票招股说明书.txt', 200,201)
'理人员发出应由其增持股份稳定股价的书面通知。 \n'第200行到210行
get_lines_txtfile('./xxx股票招股说明书.txt', 200,210)
'理人员发出应由其增持股份稳定股价的书面通知。 \n董事、高级管理人员增持股份的启动程序: \n(1)在应由董事、高级管理人员增持股份稳定股价时,有增持义务的公司\n董事、高级管理人员应在收到公司通知后 2 个交易日内,就其是否有增持公司股\n票的具体计划书面通知公司并由公司进行公告,公告应披露拟增持的数量范围、\n价格区间、总金额等信息。 \n(2)有增持义务的公司董事、高级管理人员应在增持公告做出之日开始履\n行与增持相关法定手续,并在依法办理相关手续后 30 个交易日内实施完毕。 \n(3)增持方案实施完毕后,公司应在 2 个交易日内公告公司股份变动报告。 \n如果公司公告增持计划后 3 个交易日内其股价已经不满足启动稳定公司股\n'
Note:JSON文件也可以这么读取
sed -n '2,4p' test.json
2.3 tail
import os
def get_tail_lines(fpath, line_num,is_line = False):cmd1 = ''' tail -n %s %s''' % (line_num, fpath)res = os.popen(cmd1).read()if is_line:# 最后一行是空的,多出来的res = res.split('\n')[:-1]return res
---
get_tail_lines('./xxx发行股票招股说明书.txt', 20)
'雅情况如下: \n序号 出资人名称 出资比例 \n1 杨 100.00% \n合计 100.00% \n(七)私募证券投资基金 \n永柏联投新三板为契约型私募投资基金,已于\n有限公司 招股说明书 \n \n333 \n2016 年 5 月 16 日在中基金备案手续,备案\n编码为 S201;其私募基金管理有限公司,已于 2015\n年 6 月 26 日在中国证券投登记手续,登记编\n号为 P101。 \n永柏新三资基金份额持有人情况如下: \n序号 出资人名称 出资比例 \n1 华 90.00% \n2 钱 10.00% \n合计 100.00% \n \n \n'
2.4 wc
使用wc命令 具体通过wc --help 可以查看。如:wc -l filename 就是查看文件里有多少行wc -w filename 看文件里有多少个word。wc -L filename 文件里最长的那一行是多少个字。
import os
def get_line_num(fpath):cmd1 = ''' wc -l %s ''' % fpathres = os.popen(cmd1).read()return int(res.split()[0])
---
get_line_num('./xxx股票招股说明书.txt')
14057
Python一些可能用的到的函数系列28 超大文本文件分割读取相关推荐
- Python一些可能用的到的函数系列37flipflop 对象
说明 对于调用成功一个函数,立即调用另一个函数的应用.例如从数据库获取了一批数据,将某些结果回写的过程. 内容 假设有两个函数,写成了不定参格式,这样比较通用. hello def hello(*ar ...
- Python一些可能用的到的函数系列11 本地哈希和服务器哈希比对
说明 摘要可以作为文件的唯一识别和信息验证,在进行大量存储时是很有比较的. 内容 以前不太清楚哪里出过错,感觉服务器上计算hash和本地不一致. 由于python的hashlib是对二进制文本进行计算 ...
- Python一些可能用的到的函数系列76 最大回撤率
说明 这个问题其实有点绕,写在这里备忘吧. 内容 最大回撤:从任何一个峰值向后的最大落差. 两个要点: 1 找峰值 2 从峰值往后看,找到最大落差 最后取所有峰值的最大值就是最大回撤. 如下一个数列, ...
- Python一些可能用的到的函数系列102 推断df的变量类型
说明 这个主要是为了在sql里快速建表 内容 对每列的变量进行遍历,去掉空之后进行简单的判定.数值(double.float和date)的数据长度是固定的,变化比较大的是字符型.我觉得可以采用最大最小 ...
- Python一些可能用的到的函数系列81 基于Redis Stream的简单消息队列对象
说明 一个实现消息队列简单管理的对象 内容 代码 import redis # 基于Redis Stream的消息队列 class LittleRQ:def __init__(self, host, ...
- python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation)
python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation Funct ...
- python使用matplotlib可视化雷达图(polar函数可视化雷达图、极坐标图、通过径向方向来显示数据之间的关系)
python使用matplotlib可视化雷达图(polar函数可视化雷达图.极坐标图.通过径向方向来显示数据之间的关系) 目录
- python使用matplotlib可视化、使用subplots函数将可视化的画布划分为网格状的若干子区、通过nrows和ncols参数设置设置行数和列数
python使用matplotlib可视化.使用subplots函数将可视化的画布划分为网格状的若干子区.通过nrows和ncols参数设置设置行数和列数 目录
- python使用matplotlib可视化、使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation)
python使用matplotlib可视化.使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation) 目录
最新文章
- innodb表空间结构
- Kafka如何在千万级别时优化JVM GC问题?
- UT斯达康XV6700应用及常见问题
- 为什么用户常常不会做最合理的选择?
- ADC128S022的verilog设计与仿真实现
- iOS 点转成字符串,再字符串转换成点
- presto领读 查询引擎翻译
- python 线程(一)理论部分
- 2019.08.29定时器以及轮播图
- 如何在苹果Mac中使用聚焦搜索 NTFS 格式磁盘?
- 超好用的数学公式编辑器MathType7.4下载安装及wps配置
- 全网最详细SIFT算法原理实现
- IE无法浏览网页的常见原因及解决方法(转)
- python缩减数据
- 浙江行游14---千岛湖,清凉的世界里
- JS将字符串转数组、转数字、转对象;将数组转字符串、转对象;将对象转数组、转字符串
- java用axis方式调用webservice接口
- 秒杀Excel的动态可视化报表,不用学python,用它仅需10分钟
- 3个自由度搬运机械手设计【CAD图纸+毕业论文+电路图+梯形图+接线图】
- 1231321321
热门文章
- 面试阿里不到半小时被破格录取,问我原因?还不是因为Redis
- 车联网是什么,车联网的未来发展趋势是什么
- Python小程序:判断闰年
- Gnocchi: 4、Gnocchi对接Ceilometer
- 从零开始学VUE之Webpack(Html打包插件的使用)
- java 10进制转64进制_十进制与64进制互相转换算法
- ImmunoChemistry艾美捷基本细胞毒性试验试剂盒测定方案
- 免拆诊断 | 2010 款宝马 320i 车冷机急加速时发动机熄火
- 异想维度 java_JAVA异常的最佳工程学实践探索
- Android实现信息安全中维吉尼亚密码技术