亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

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

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

眾所周知,python文件讀取文件的時(shí)候所支持的newlines(即換行符),是指定的。這一點(diǎn)不管是從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', 'rn'): raise ValueError('illegal newline value: %r' % (newline,))

好吧,問題來了,如果你恰好是個(gè)苦逼的生物狗,正在用python處理所謂的fastq格式的測序結(jié)果文件,每次只讀一行往往不是你想要的。Ok, 我們也都知道其實(shí)這個(gè)問題在Perl里面十分好解決,無非就是重新定義下文件的分割符($/,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;

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

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

方案一的代碼:

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中的方法(親測),那么在Python2.x中需要改動的地方,目測好像是(沒有親測)

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

這個(gè)方法看上去還是比較elegant,但是efficient 嗎?答案恐怕并不,畢竟放棄了C模塊的速度優(yōu)勢,但是OOP寫起來還是比較舒服的。對了值得指出的Python的I/O是一個(gè)layer一個(gè)layer的累加起來的。從這里我們就能看出來。當(dāng)然里面的繼承關(guān)系還是值得研究一下的,從最開始的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)雅程度也還行,至于效率么,請自行比較和測試吧(畢竟好多生物程序猿是不關(guān)心效率的…..)。如此一來,比Perl多敲了好多代碼,唉,懷念Perl的時(shí)代啊,簡單粗暴有效,就是幸福的哲學(xué)么。

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

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

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

出現(xiàn)錯(cuò)誤的原因是字符串中包含了回車符(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ù)不合法,類似“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ù)中。

解決方案:

將類似的情形通過正則篩選出來通過下面的方式處理。

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

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

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

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

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

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

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暫不支持單引號的實(shí)體名稱,而支持單引號的實(shí)體編號,故單引號轉(zhuǎn)義成實(shí)體編號,其它字符轉(zhuǎn)義成實(shí)體名稱 input = input.replace(''', '&quot;'); //雙引號也需要轉(zhuǎn)義,所以加一個(gè)斜線對其進(jìn)行轉(zhuǎn)義 input = input.replace('n', '<br/>'); //不能把n的過濾放在前面,因?yàn)檫€要對<和>過濾,這樣就會導(dǎo)致<br/>失效了 return input; }

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

標(biāo)簽: Python 編程
主站蜘蛛池模板: 亚洲另类网| 国产亚洲情侣一区二区无 | 亚洲在线a| 色视频在线观看 | 国产美女久久久 | 亚洲免费美女视频 | 精品国产一区二区三区四区色 | 国产成人精品高清免费 | 色播影院性播12306影视 | 国产欧美一区视频在线观看 | 国产肥老妇免费视频 | 911亚洲精品 | 亚洲 另类 在线 欧美 制服 | 国产好大好爽久久久久久久 | 老头边吃奶边做边爱 | 成人免费一级在线播放 | 久久99精品国产一区二区三区 | 免费观看片 | 成人乱码一区二区三区四区 | 麻豆网在线观看 | 巨大巨粗巨长 黑人长吊视频 | 国产在线精品一区二区夜色 | 林美仑在线三级播放 | 一级看片免费视频 | 中国产一级毛片 | 韩国免费特一级毛片 | 欧美性色黄大片a级毛片视频 | 站长推荐国产午夜免费视频 | 超级乱淫片67194免费看 | 色接久久 | 91影院在线观看 | 九九热视频精品在线观看 | 国产高清露脸 | 国产精品99久久 | 久久中国| 国产a一级毛片午夜剧院 | 精品高清写真视频在线 | 亚洲欧美成人影院 | 亚洲精品久久久久网站 | 日韩黄毛片 | 性插影院 |