使用Python文件读写,自定义分隔符(custom delimiter)


Posted in Python onJuly 05, 2020

众所周知,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, "", "\n", "\r", "\r\n"):
 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 $_ = <FH>; # whole file now here
s/\n[ \t]+/ /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("{}:\t{}".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 = '\n', 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)

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

解决方案:

转义

json_data = json_data.replace('\r', '\\r').replace('\n', '\\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 = '"[\s\S]+?":\s?"([\s\S]+?)"\}?\}?\]?,'

后续使用中发现无法匹配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("\n", "<br/>"); //不能把\n的过滤放在前面,因为还要对<和>过滤,这样就会导致<br/>失效了
    return input;
  }

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

Python 相关文章推荐
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
python中协程实现TCP连接的实例分析
Oct 14 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python中threading开启关闭线程操作
May 02 Python
python3.8动态人脸识别的实现示例
Sep 21 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
如何清空python的变量
Jul 05 #Python
增大python字体的方法步骤
Jul 05 #Python
树莓派升级python的具体步骤
Jul 05 #Python
Python OpenCV去除字母后面的杂线操作
Jul 05 #Python
使用OpenCV去除面积较小的连通域
Jul 05 #Python
学python最电脑配置有要求么
Jul 05 #Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 #Python
You might like
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
Python实例之wxpython中Frame使用方法
2014/06/09 Python
Python中实现的RC4算法
2015/02/14 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
Apache部署Django项目图文详解
2019/07/30 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
Python3 合并二叉树的实现
2019/09/30 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
我们的节日清明节活动方案
2014/03/05 职场文书
测量员岗位职责
2015/02/14 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
关于MySQL中的 like操作符详情
2021/11/17 MySQL
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers