众所周知,python文件读取文件的时候所支持的newlines(即换行符),是指定的。这一点不管是从python的doucuments上还是在python的源码中(作者是参考了python的io版本,并没有阅读C版本),都可以看出来:

if newline is not None and not isinstance(newline, str):

raise TypeError("illegal newline type: %r" % (type(newline),))

if newline not in (None, "", "

", "", "

"):

raise ValueError("illegal newline value: %r" % (newline,))

好吧,问题来了,如果你恰好是个苦逼的生物狗,正在用python处理所谓的fastq格式的测序结果文件,每次只读一行往往不是你想要的。Ok, 我们也都知道其实这个问题在Perl里面十分好解决,无非就是重新定义下文件的分割符($/,The input record separator, newline by default. Set undef to read through the end of file.)

local $/; # enable "slurp" mode

local $_ = ; # whole file now here

s/

[ ]+/ /g;

简单粗暴有效!《Programming Perl》开头的那些关于什么是happiness定义看来所言非虚,所以你只要需要将$/定义为fastq格式的分隔符就ok了。

但是,如果是Python呢?(容易钻牛角尖的孩纸,又或者是不喜欢花括号的孩子…..反正就是强行高端了)。终于要进入正题了,OK,在python中又有两种方式解决这个问题,看你个人喜好选择了(当然要是有大神知道四种、五种方法,也不妨指导一下我这个小菜鸟)。

方案一的代码:

import _pyio

import io

import functools

class MyTextWrapper(_pyio.TextIOWrapper):

def readrecod(self, sep):

readnl, self._readnl = self._readnl, sep

self._readtranslate = False

self._readuniversal = False

try:

return self.readline()

finally:

self._readnl = readnl

#class MyTextWrapper(_pyio.TextIOWrapper):

# def __init__(self, *args, separator, **kwargs):

# super().__init__(*args,**kwargs)

# self._readnl = separator

# self._readtranslate = False

# self._readuniversal = False

# print("{}:{}".format(self,self._readnl))

f = io.open("data",mode="rt")

#f = MyTextWrapper(f.detach(),separator = ">")

#print(f._readnl)

f = MyTextWrapper(f.detach())

records=iter(functools.partial(f.readrecod, ">"), "")

for r in records:

print(r.strip(">"))

print("###")

Ok,这是Python3.x中的方法(亲测),那么在Python2.x中需要改动的地方,目测好像是(没有亲测)

super(MyTextWrapper,self).__init__(*args,**kwargs)

这个方法看上去还是比较elegant,但是efficient 吗?答案恐怕并不,毕竟放弃了C模块的速度优势,但是OOP写起来还是比较舒服的。对了值得指出的Python的I/O是一个layer一个layer的累加起来的。从这里我们就能看出来。当然里面的继承关系还是值得研究一下的,从最开始的IOBase一直到最后的TextIOWrapper,这里面的故事,还是要看一看的。

方案二的代码:

#!/usr/bin/env python

def delimited(file, delimiter = "

", bufsize = 4096):

buf = ""

while True:

newbuf = file.read(bufsize)

if not newbuf:

yield buf

return

buf += newbuf

lines = buf.split(delimiter)

for line in lines[:-1]:

yield line

buf = lines[-1]

with open("data", "rt") as f:

lines = delimited(f, ">", bufsize = 1)

for line in lines:

print line,

print "######"

Ok,这里用到了所谓的generator函数,优雅程度也还行,至于效率么,请自行比较和测试吧(毕竟好多生物程序猿是不关心效率的…..)。如此一来,比Perl多敲了好多代码,唉,怀念Perl的时代啊,简单粗暴有效,就是幸福的哲学么。

当然还有童鞋要问,那么能不能又elegant还efficient(我可是一个高端的生物程序猿,我要强行高端!)答案是有的,请用Cython! 问题又来了,都Cython了,为什么不直接用C呢?确实,C语言优美又混乱。

补充知识:Python.json.常见两个错误处理(Expecting , delimiter)(Invalid control character at)

ValueError: Invalid control character at: line 1 column 122(char 123)

出现错误的原因是字符串中包含了回车符()或者换行符(

解决方案:

转义

json_data = json_data.replace("", "\r").replace("

", "\n")

使用关键字strict

json.loads(json_data, strict=False)

ValueError: Expecting , delimiter: line 13 column 650 (char 4186)

原因:json数据不合法,类似“group_buy_create_description_text”: “1. Select the blue “Buy” button to let other shoppers buy with you.这样的内容出现在json数据中。

解决方案:

将类似的情形通过正则筛选出来通过下面的方式处理。

正则表达式如下:

json_data = json_data.replace("""", ""########"")

js_str = ""[sS]+?":s?"([sS]+?)"}?}?]?,"

后续使用中发现无法匹配value为空的情况,故先做一下预处理

这个正则可以匹配到大部分的key,value中的value值,但是也有例外,暂时的处理方法是如果匹配结果中包含”{“, “}”, “[“, “]”这样的字符,说明是匹配失败结果,跳过处理。其他的使用下边的方法替换掉可能出问题的字符。

如果大家有更好的正则匹配方式,欢迎随时批评指正。

def htmlEscape(input) {

if not input

return input;

input = input.replace("&", "&");

input = input.replace("<", "<");

input = input.replace(">", ">");

input = input.replace(" ", " ");

input = input.replace(""", "'"); //IE暂不支持单引号的实体名称,而支持单引号的实体编号,故单引号转义成实体编号,其它字符转义成实体名称

input = input.replace(""", """); //双引号也需要转义,所以加一个斜线对其进行转义

input = input.replace("

", "
"); //不能把

的过滤放在前面,因为还要对<和>过滤,这样就会导致
失效了

return input;

}

以上这篇使用Python文件读写,自定义分隔符(custom delimiter)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

原文链接:https://blog.csdn.net/dugujian123/article/details/52547183

python delimiter分隔符用法_使用Python文件读写,自定义分隔符(custom delimiter)相关推荐

  1. python 输出文件分隔符_使用Python文件读写,自定义分隔符的方法

    使用Python文件读写,自定义分隔符的方法 发布时间:2020-07-06 11:07:56 来源:亿速云 阅读:121 作者:清晨 小编给大家分享一下使用Python文件读写,自定义分隔符的方法, ...

  2. python类高级用法_十.python面向对象高级用法

    1.反射 1.1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的 ...

  3. python正则表达式group用法_【Python】正则表达式用法

    导读:正则在各语言中的使用是有差异的,本文以 Python 3 为基础.本文主要讲述的是正则的语法,对于 re 模块不做过多描述,只会对一些特殊地方做提示. 很多人觉得正则很难,在我看来,这些人一定是 ...

  4. python的property用法_在python中property怎样使用-百度经验

    在python中property可以使类中的方法变为类中的属性一样来使用,使得类中的属性值不易暴露,更加安全,那么在python中property怎样使用呢?下面小编就带大家来看看详细的教程! 工具/ ...

  5. python中len用法_【python】python中len()怎么用-百度经验

    本文,介绍一下python中len()函数的用法. 工具/原料 电脑 python3.6(Anaconda) 方法/步骤 1 len函数的作用,是Return the number of items ...

  6. python中globals用法_在Python中使用globals()的原因?

    在"声明性python"中很有用. 例如,在下面的globals()和globals()中,是用于定义一系列数据结构的类,这些数据结构随后将被某些程序包用作其输入或配置. 这使您可 ...

  7. lambda在python中的用法_在python中对lambda使用.assign()方法

    我在Python中运行以下代码:#Declaring these now for later use in the plots TOP_CAP_TITLE = 'Top 10 market capit ...

  8. python连接oracle用法_【Python Oracle】使用cx_Oracle 连接oracle的简单介绍

    连接数据库的几种方式: 语法: cx_Oracle.connect('username','pwd','IP/HOSTNAME:PORT/TNSNAME') import cx_Oracle db1= ...

  9. python的super用法_关于Python的super用法研究

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递. 举一个很常见的例子: >> ...

最新文章

  1. SAP RETAIL分配表的查询报表
  2. 华为网赛云数据中心基础原理自测答案
  3. 自动化测试如何解决验证码的问题
  4. C++ this指针详解(精辟)
  5. 【测试面试题】显示输入数字中的最大值
  6. 数据库读写分离(aop方式完整实现)
  7. 招商银行的AI野心:转型金融科技公司?
  8. torch.flatten()函数
  9. Hibernate 4.3 ORM工具
  10. 20150324 作业1(升级喽)
  11. 基于MOSS2007的全局导航用户控件的实现 [Ver2.0]
  12. 轻松掌握shell编程中数组的常见用法及示例
  13. 无线路由器 tftp服务器怎么开启,水星路由器tftp服务器怎么开启
  14. 小米路由器3 变砖 ttl 救砖,刷入padavan
  15. 使用FFMPEG合并视频
  16. 软件定义汽车下的整车开发
  17. linux cfg配置文件,isolinux.cfg配置文件的写法
  18. 腾龙视觉设计学院孙姣老师讲pscs6艺术照片课录屏
  19. Win10 桌面图标出现空文件夹的删除及桌面图标排列问题
  20. 使用功能点估算模型评估软件测试的工作量

热门文章

  1. 基于Taro + 云开发 打造婚礼邀请函
  2. 什么是经验贝叶斯克里金插值法?
  3. 南京大学量子计算机陈教授,南京大学马小松: 潜心走入量子世界
  4. 三体系是哪三体系的认证
  5. 云盘大规模关停真正原因:不赚钱
  6. 【2022新书】机器学习在金融时间序列分析与预测中的应用
  7. echarts实现带光圈的环形图
  8. SD卡和TF卡的区别
  9. 文章瞎读 SigVox – A 3D feature matching algorithm for automatic street object recognition in mobile lase
  10. html lorem自动填充,使用 lorem 快捷生成随机文本填充页面