由数据库导出的数据是格式化数据,如下所示,每两个<REC>之间的数据是一个记录的所有字段数据,如<TITLE>、<ABSTRACT>、<SUBJECT_CODE>。但是每条记录中可能某些字段信息为空,

在导出的文本文件中,就会缺失这个字段,如记录3,缺失<ABSTRACT>这个字段,记录4,缺失<SUBJECT_CODE>这个字段。

<REC>(记录1)
<TITLE>=Regulation of the protein disulfide proteome by mitochondria in mammalian cells.
<ABSTRACT>=The majority of protein disulfides in cells is considered an important inert structural, rather than a dynamic regulatory, determinant of protein function.
<SUBJECT_CODE>=A006_8;D050_42;A006_62
<REC>(记录2)
<TITLE>=Selective control of cortical axonal spikes by a slowly inactivating K+ current.
<ABSTRACT>=Neurons are flexible electrophysiological entities in which the distribution and properties of ionic channels control their behaviors.
<SUBJECT_CODE>=E057_6;E062_318;I135_46
<REC>(记录3)
<TITLE>=Coupling of hydrogenic tunneling to active-site motion in the hydrogen radical transfer catalyzed by a coenzyme B12-dependent mutase.
<SUBJECT_CODE>=B016_11;B014_32;B014_54
<REC>(记录4)
<TITLE>=Hyaluronic acid hydrogel for controlled self-renewal and differentiation of human embryonic stem cells.
<ABSTRACT>=Control of self-renewal and differentiation of human ES cells (hESCs) remains a challenge.
<REC>(记录5)
<TITLE>=Biologically inspired crack trapping for enhanced adhesion.
<ABSTRACT>=We present a synthetic adaptation of the fibrillar adhesion surfaces found in nature.
<SUBJECT_CODE>=A004_57;B022_73;C034_22
<REC>(记录6)
<TITLE>=Identification of a retroviral receptor used by an envelope protein derived by peptide library screening.
<ABSTRACT>=This study demonstrates the power of a genetic selection to identify a variant virus that uses a new retroviral receptor protein.
<SUBJECT_CODE>=A006_8;E059_A;E059_5

1、从数据库中导出数据时,一些表格的导出文件(txt文本文件),占用空间会在3-4G个左右,无法直接读入内存;

2、通过python的linecache模块的getlines函数读取600M以上的文本文件时,有时会因为PC当时的运行情况,内存不足等原因,读取得到的内容为空;

备注:linecache模块的getlines()函数最终是调用file.readlines()函数来一次读取数据的,如果文件过大,getlines函数会返回一个空链表作为结果。

3、逐行读取文本内容,一是不方便后续的处理流程,后续流程需要对每条记录的数据进行处理,而非对每行数据进行处理;二是逐行读取文本内容,速度较慢;

因此,有必要针对这类格式文件,设计一种可以读取一定大小,并且这段文本中的记录都是完整的,不会出现最后一个记录只有部分字段数据;

实现代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- coding: GBK -*-
import os
import sys
from time import time REC_STR = '<REC>' def read_text_in_buffer_multi_line(fd,length,label):
BUFFER = []
fd.seek(label,0)#根据新的label设置文件位置
flag = 0
line = '' BUFFER = fd.readlines(length)#读取一定大小的文本,并存放在BUFFER中
line = fd.readline()#读取下一行,用于判断文件是否结束
if not line:
flag = 1 label = fd.tell()#获取当前的文件位置 if flag == 0:#如果文件没有结束,则将BUFFER中最后一个<REC>之后的数据丢弃;否则则直接返回BUFFER
BUFFER_POST = [] while True:
temp = BUFFER.pop()#丢弃数据 if temp.startswith(REC_STR) == False:#判断是否为<REC>
BUFFER_POST.append(temp)
else:#是<REC>,结束循环
BUFFER_POST.append(temp)
break len_buf_post = len(''.join(BUFFER_POST))#获取到丢弃的数据的字节数目
label = label - len_buf_post - len(line)#当前位置减去丢弃的字节数目,再减去多读取的一行的数据的字节数目
return BUFFER,label if __name__ == "__main__":
filename = "Data\\SJWD_U.txt"
fd = open(filename,'rb')
label = 0
readlen = 100000*210#待读取的字节数目
fout = open("out.txt",'w') begin = time()
while True:
buffer_list,label = read_text_in_buffer_multi_line(fd,readlen,label)
if buffer_list == []:
break
else:
fout.writelines(buffer_list)
end = time()
print "time:",(end - begin)
fd.close()
fout.close()

针对格式文件,Python读取一定大小的文件内容的更多相关文章

  1. python读取txt批量创建文件

    python读取txt批量创建文件 pythonbatchfile 前几天有个小问题, 需要批量建立很多文件夹,, 所以手动写了个小的脚本, 后续可以直接使用 读取目录文件, 然后直接创建相应的文件 ...

  2. 编写Java程序,在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字“[ 来自新华社 ]”,保存到一个新的 txt 文件内

    查看本章节 查看作业目录 需求说明: 在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字"[ 来自新华社 ]",保存到一个新的 txt 文件内 实现思路: 创建 Sa ...

  3. python读取和写入csv文件

    读取csv文件: def readCsv(): rows=[] with file(r'E:\py\py01\Data\system.csv','rb') as f: reads=csv.reader ...

  4. python读取并写入mat文件

    用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); save matData.mat 用python3读取并写入 ...

  5. python 读取mysql存储的文件路径下载文件,内容解析,上传七牛云,内容入es

    #!/usr/bin/env python # -*- coding: utf-8 -*- import ConfigParser import json import os import re fr ...

  6. python 读取csv中的文件,从sftp下载文件

    需要从sftp上下载一些图片文件,文件名存放在一个csv文件中.代码如下: # -*- coding:utf-8 -*- import paramiko import csv import os de ...

  7. python读取、写入txt文本内容

    转载:https://blog.csdn.net/qq_37828488/article/details/100024924 python常用的读取文件函数有三种read().readline().r ...

  8. linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理

    不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用 ...

  9. Linux下删除空文件,删除指定大小的文件

    Linux下批量删除空文件(大小等于0的文件)的方法: find . -name "*" -type f -size 0c | xargs -n 1 rm -f 用这个还可以删除指 ...

随机推荐

  1. 由overflow-x:scroll产生的收获

    我们都知道float:left属性会让元素向左浮动,如果用一个div将几个左浮动的li包起来,是不是div的宽度被li撑得很长很长呢,代码: <!DOCTYPE html> <htm ...

  2. Java 实现HTML富文本导出至word完美解决方案

    一. 问题的提出 最近用java开发一个科技项目信息管理系统,里面有一个根据项目申请书的模板填写项目申报信息的功能,有一个科技项目申请书word导出功能. 已有的实现方式:采用标准的jsp模板输出实现 ...

  3. bug: 在缓存行高时,总是记录错误.

    一,现象: 1.在 cell 中添加了一个 label, 并对 label 设置了 attributeText, 结果滑动的过程中,cell 的高度总是不对,多次出现下一个 cell 覆盖上一个 ce ...

  4. PHP:Xdebug配置

    在配置Xdebug时,之前经历了无数次失败,终于配置成功! 以下是配置失败的原因: 1.下载时,选用Xdebug的版本不正确: 2.配置时,Xdebug文件名或文件的路径不正确: 在参考 http:/ ...

  5. Ansible-playbook批量部署,更新war脚本,可以再完善----后续再update

    - name: install tomcat admin hosts: all sudo: True vars: war_file: /root/test.war tomcat_root: /data ...

  6. Myeclipse 不能保存汉字

    window-->首选项-->content type-->Text-->Default encoding改为UTF-8,点击update

  7. Django models知识小点

    django 为使用一种新的方式,即关系对象映射(ORM) 一,创建表 1,基本结构 注意: 1,创建标的时候,如果我们不给表加自增列,生成表的时候会默认给我们生成一列为ID的自增列,当然我们也可以自 ...

  8. 回忆那些我们曾今铭记过的.NET重点知识

    正如标题所说的那样,到底是那些.NET的知识点呢?     接下来就让我带着你们去了解这些知识点吧! 1.接口 2.索引器 3.FOREACH的本质 4.匿名内部类 5.运算符的重载 一.什么是接口? ...

  9. Java中堆内存和栈内存详解

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  10. Linq中使用反射实现--LINQ通用数据表绑定DataGrid控件的方法(原创)

    项目需求,因为项目中存在很多表,这些表的内容需要呈现给客户浏览.转载请注明出处 相信很多写过程序的设计者很容易的用以下方式实现 在SqlConnect ,DataSet 的方式,我们很轻松的可以通过S ...