最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年07月05日 14:38:47   作者:__孤獨(dú)患者_(dá)_  
這篇文章主要介紹了使用Python文件讀寫,自定義分隔符(custom delimiter),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

眾所周知,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", "\r\n"):
 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" mode
local $_ = <FH>; # whole file now here
s/\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 _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中需要改動(dòng)的地方,目測好像是(沒有親測)

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 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函數(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 = '"[\s\S]+?":\s?"([\s\S]+?)"\}?\}?\]?,'

后續(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)檫€要對<和>過濾,這樣就會(huì)導(dǎo)致<br/>失效了
    return input;
  }

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

相關(guān)文章

  • Django filter動(dòng)態(tài)過濾與排序?qū)崿F(xiàn)過程解析

    Django filter動(dòng)態(tài)過濾與排序?qū)崿F(xiàn)過程解析

    這篇文章主要介紹了Django filter動(dòng)態(tài)過濾與排序?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Pytorch模型定義與深度學(xué)習(xí)自查手冊

    Pytorch模型定義與深度學(xué)習(xí)自查手冊

    這篇文章主要為大家介紹了Pytorch模型定義與深度學(xué)習(xí)的自查手冊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python屬于軟件嗎

    python屬于軟件嗎

    在本篇內(nèi)容里小編給Python新手整理了關(guān)于python是軟件嗎的相關(guān)知識點(diǎn),有興趣的朋友們可以閱讀下。
    2020-06-06
  • Python繪制計(jì)算機(jī)CPU占有率變化的折線圖

    Python繪制計(jì)算機(jī)CPU占有率變化的折線圖

    這篇文章主要為大家詳細(xì)介紹了Python繪制計(jì)算機(jī)CPU占有率變化的折線圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Django使用echarts進(jìn)行可視化展示的實(shí)踐

    Django使用echarts進(jìn)行可視化展示的實(shí)踐

    可視化是將數(shù)據(jù)轉(zhuǎn)換成圖形或圖像在屏幕上顯示出來,本文主要介紹了Django使用echarts進(jìn)行可視化展示的實(shí)踐,感興趣的可以了解一下
    2021-06-06
  • Python?創(chuàng)建格式化字符串方法

    Python?創(chuàng)建格式化字符串方法

    這篇文章主要介紹了Python?創(chuàng)建格式化字符串方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Python六大開源框架對比

    Python六大開源框架對比

    在這篇文章里,我們將為Python Web開發(fā)者回顧基于Python的6大Web應(yīng)用框架。無論你是出于愛好還是需求,這六大框架都可能會(huì)成為你工作上不錯(cuò)的得力助手。
    2015-10-10
  • python解壓縮文件或文件夾兩種常見方式(附代碼)

    python解壓縮文件或文件夾兩種常見方式(附代碼)

    這篇文章主要介紹了python解壓縮文件或文件夾兩種常見方式,Python的zipfile和shutil模塊提供了強(qiáng)大的文件和文件夾壓縮與解壓縮功能,zipfile模塊適合精細(xì)控制,而shutil模塊則快速簡單,文中提供了詳細(xì)的代碼示例,需要的朋友可以參考下
    2025-04-04
  • 14個(gè)Python處理Excel的常用操作分享

    14個(gè)Python處理Excel的常用操作分享

    自從學(xué)了Python后就逼迫用Python來處理Excel,所有操作用Python實(shí)現(xiàn)。目的是鞏固Python,與增強(qiáng)數(shù)據(jù)處理能力。本文為大家整理了14個(gè)Python處理Excel的常用操作,非常好用,希望對大家有所幫助
    2023-03-03
  • python中entry用法講解

    python中entry用法講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python中entry用法講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-12-12

最新評論

改则县| 那曲县| 伊通| 乐至县| 禄丰县| 甘洛县| 友谊县| 宝丰县| 永川市| 灵川县| 青铜峡市| 梁山县| 榕江县| 长海县| 武平县| 修武县| 开封市| 德保县| 紫金县| 晴隆县| 赤城县| 长白| 盈江县| 苍梧县| 铜鼓县| 连城县| 临猗县| 洛川县| 鄢陵县| 法库县| 镇安县| 县级市| 高密市| 陵水| 博白县| 海兴县| 丹棱县| 海盐县| 泸西县| 衡山县| 汽车|