电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

使用Python文件讀寫(xiě),自定義分隔符(custom delimiter)

瀏覽:117日期:2022-07-18 15:35:59

眾所周知,python文件讀取文件的時(shí)候所支持的newlines(即換行符),是指定的。這一點(diǎn)不管是從python的doucuments上還是在python的源碼中(作者是參考了python的io版本,并沒(méi)有閱讀C版本),都可以看出來(lái):

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', 'rn'): raise ValueError('illegal newline value: %r' % (newline,))

好吧,問(wèn)題來(lái)了,如果你恰好是個(gè)苦逼的生物狗,正在用python處理所謂的fastq格式的測(cè)序結(jié)果文件,每次只讀一行往往不是你想要的。Ok, 我們也都知道其實(shí)這個(gè)問(wèn)題在Perl里面十分好解決,無(wú)非就是重新定義下文件的分割符($/,The input record separator, newline by default. Set undef to read through the end of file.)

local $/; # enable 'slurp' modelocal $_ = <FH>; # whole file now heres/n[ t]+/ /g;

簡(jiǎn)單粗暴有效!《Programming Perl》開(kāi)頭的那些關(guān)于什么是happiness定義看來(lái)所言非虛,所以你只要需要將$/定義為fastq格式的分隔符就ok了。

但是,如果是Python呢?(容易鉆牛角尖的孩紙,又或者是不喜歡花括號(hào)的孩子…..反正就是強(qiáng)行高端了)。終于要進(jìn)入正題了,OK,在python中又有兩種方式解決這個(gè)問(wèn)題,看你個(gè)人喜好選擇了(當(dāng)然要是有大神知道四種、五種方法,也不妨指導(dǎo)一下我這個(gè)小菜鳥(niǎo))。

方案一的代碼:

import _pyioimport ioimport functoolsclass 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中的方法(親測(cè)),那么在Python2.x中需要改動(dòng)的地方,目測(cè)好像是(沒(méi)有親測(cè))

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

這個(gè)方法看上去還是比較elegant,但是efficient 嗎?答案恐怕并不,畢竟放棄了C模塊的速度優(yōu)勢(shì),但是OOP寫(xiě)起來(lái)還是比較舒服的。對(duì)了值得指出的Python的I/O是一個(gè)layer一個(gè)layer的累加起來(lái)的。從這里我們就能看出來(lái)。當(dāng)然里面的繼承關(guān)系還是值得研究一下的,從最開(kāi)始的IOBase一直到最后的TextIOWrapper,這里面的故事,還是要看一看的。

方案二的代碼:

#!/usr/bin/env pythondef 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函數(shù),優(yōu)雅程度也還行,至于效率么,請(qǐng)自行比較和測(cè)試吧(畢竟好多生物程序猿是不關(guān)心效率的…..)。如此一來(lái),比Perl多敲了好多代碼,唉,懷念Perl的時(shí)代啊,簡(jiǎn)單粗暴有效,就是幸福的哲學(xué)么。

當(dāng)然還有童鞋要問(wèn),那么能不能又elegant還efficient(我可是一個(gè)高端的生物程序猿,我要強(qiáng)行高端!)答案是有的,請(qǐng)用Cython! 問(wèn)題又來(lái)了,都Cython了,為什么不直接用C呢?確實(shí),C語(yǔ)言?xún)?yōu)美又混亂。

補(bǔ)充知識(shí):Python.json.常見(jiàn)兩個(gè)錯(cuò)誤處理(Expecting , delimiter)(Invalid control character at)

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

出現(xiàn)錯(cuò)誤的原因是字符串中包含了回車(chē)符(r)或者換行符(n)

解決方案:

轉(zhuǎn)義

json_data = json_data.replace(’r’, ’r’).replace(’n’, ’n’)

使用關(guān)鍵字strict

json.loads(json_data, strict=False)

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

原因:json數(shù)據(jù)不合法,類(lèi)似“group_buy_create_description_text”: “1. Select the blue “Buy” button to let other shoppers buy with you.這樣的內(nèi)容出現(xiàn)在json數(shù)據(jù)中。

解決方案:

將類(lèi)似的情形通過(guò)正則篩選出來(lái)通過(guò)下面的方式處理。

正則表達(dá)式如下:

json_data = json_data.replace(’''’, ’'########'’)

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

后續(xù)使用中發(fā)現(xiàn)無(wú)法匹配value為空的情況,故先做一下預(yù)處理

這個(gè)正則可以匹配到大部分的key,value中的value值,但是也有例外,暫時(shí)的處理方法是如果匹配結(jié)果中包含”{“, “}”, “[“, “]”這樣的字符,說(shuō)明是匹配失敗結(jié)果,跳過(guò)處理。其他的使用下邊的方法替換掉可能出問(wèn)題的字符。

如果大家有更好的正則匹配方式,歡迎隨時(shí)批評(píng)指正。

def htmlEscape(input) { if not input return input; input = input.replace('&', '&amp;'); input = input.replace('<', '&lt;'); input = input.replace('>', '&gt;'); input = input.replace(' ', '&nbsp;'); input = input.replace('’', '&#39;'); //IE暫不支持單引號(hào)的實(shí)體名稱(chēng),而支持單引號(hào)的實(shí)體編號(hào),故單引號(hào)轉(zhuǎn)義成實(shí)體編號(hào),其它字符轉(zhuǎn)義成實(shí)體名稱(chēng) input = input.replace(''', '&quot;'); //雙引號(hào)也需要轉(zhuǎn)義,所以加一個(gè)斜線(xiàn)對(duì)其進(jìn)行轉(zhuǎn)義 input = input.replace('n', '<br/>'); //不能把n的過(guò)濾放在前面,因?yàn)檫€要對(duì)<和>過(guò)濾,這樣就會(huì)導(dǎo)致<br/>失效了 return input; }

以上這篇使用Python文件讀寫(xiě),自定義分隔符(custom delimiter)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
主站蜘蛛池模板: 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 翰香原枣子坊加盟费多少钱-正宗枣核糕配方培训利润高飘香 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 高铝矾土熟料_细粉_骨料_消失模_铸造用铝矾土_铝酸钙粉—嵩峰厂家 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 猎头招聘_深圳猎头公司_知名猎头公司 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 山东信蓝建设有限公司官网| 模具硅橡胶,人体硅胶,移印硅胶浆厂家-宏图硅胶科技 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 企业微信scrm管理系统_客户关系管理平台_私域流量运营工具_CRM、ERP、OA软件-腾辉网络 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格] | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 阜阳在线-阜阳综合门户 | 千淘酒店差旅平台-中国第一家针对TMC行业的酒店资源供应平台 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 纸箱网 -纸箱机械|设备|包装纸盒|包装印刷行业门户网站 |