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

Python文本處理之按行處理大文件的方法

 更新時(shí)間:2018年04月09日 11:31:35   作者:aturbofly  
下面小編就為大家分享一篇Python文本處理之按行處理大文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧

以行的形式讀出一個(gè)文件最簡(jiǎn)單的方式是使用文件對(duì)象的readline()、readlines()和xreadlines()方法。

Python2.2+為這種頻繁的操作提供了一個(gè)簡(jiǎn)化的語(yǔ)法——讓文件對(duì)象自身在行上高效迭代(這種迭代是嚴(yán)格的向前的)。

為了讀取整個(gè)文件,可能要使用read()方法,且使用字符串的split()來(lái)將它拆分WEIGHT行或其他塊。

下面是一些例子:

  >>> for line in open('chap1.txt'): # Python 2.2+
  ...  # process each line in some manner
  ...  pass
  ...
  >>> linelist = open('chap1.txt').readlines()
  >>> print linelist[1849],
  EXERCISE: Working with lines from a large file
  >>> txt = open('chap1.txt').read()
  >>> from os import linesep
  >>> linelist2 = txt.split(linesep)

如果文件不大,讀取整個(gè)文件內(nèi)容也沒有關(guān)系。但如果是大文件,時(shí)間和內(nèi)存就是要重點(diǎn)關(guān)注的了。比如,復(fù)雜文檔或者活動(dòng)日志文件,通常有上M,甚至很多G的大小。就算這些文件的內(nèi)容沒有超出可用內(nèi)存的尺寸,讀取他們?nèi)匀皇窍喈?dāng)耗時(shí)的。

很明顯,如果你需要處理文件的每一行,那就必須讀取整個(gè)文件;如果可以按序列處理,xreadlines方法是一種更節(jié)約內(nèi)存的方法。但是對(duì)于那些僅僅需要一個(gè)大文件的一部分行的應(yīng)用,要獲得提高其實(shí)并不難。對(duì)于這一點(diǎn),模塊“l(fā)inecache”非常合適。

具有緩存功能的行列表

使用linecache可以直接從一個(gè)文件中讀取指定行:

  >>> import linecache
  >>> print linecache.getline('chap1.txt',1850),
  PROBLEM: Working with lines from a large file

記住,linecache.getline()的計(jì)數(shù)是從1開始的。

如果有一個(gè)即具有“l(fā)inecache”的效率,又有列表的一些功能的對(duì)象就好了。這個(gè)對(duì)象不僅可以枚舉和索引,同時(shí)還支持切片。

#------------------ cachedlinelist.py --------------------#
  import linecache, types
  class CachedLineList:
   # Note: in Python 2.2+, it is probably worth including:
   # __slots__ = ('_fname')
   # ...and inheriting from 'object'
   def __init__(self, fname):
    self._fname = fname
   def __getitem__(self, x):
    if type(x) is types.SliceType:
     return [linecache.getline(self._fname, n+1)
       for n in range(x.start, x.stop, x.step)]
    else:
     return linecache.getline(self._fname, x+1)
   def __getslice__(self, beg, end):
    # pass to __getitem__ which does extended slices also
    return self[beg:end:1]

使用這個(gè)新對(duì)象幾乎和使用一個(gè)由“open(fname).readlines()”創(chuàng)建的列表一樣。除了它的效率要更高之外(特別是在內(nèi)存使用方面):

  >>> from cachedlinelist import CachedLineList
  >>> cll = CachedLineList('../chap1.txt')
  >>> cll[1849]
  ' PROBLEM: Working with lines from a large file\r\n'
  >>> for line in cll[1849:1851]: print line,
  ...
  PROBLEM: Working with lines from a large file
  ----------------------------------------------------------
  >>> for line in cll[1853:1857:2]: print line,
  ...
  a matter of using the '.readline()', '.readlines()' and
  simplified syntax for this frequent operation by letting the

隨機(jī)行

有時(shí)候,特別是為了測(cè)試,可能需要檢查某些典型的行。人們很容易就誤認(rèn)為一個(gè)對(duì)文本的前面幾行和后面幾行有效的處理就能適用任何其他地方。很不幸,很多文件的前幾行和最后幾行通常都是非典型的:有時(shí)候是消息頭或注腳,有時(shí)候可能是開發(fā)時(shí)的日志文件的前幾行等等。窮舉測(cè)試整個(gè)文件并不是你想要的,通常這樣也非常的耗時(shí)。

在大多數(shù)系統(tǒng)上,查找一個(gè)文件中的特定位置要比讀出該位置前的所有內(nèi)容直到到達(dá)該位置快的多。

就算使用linecache,要到達(dá)緩存行,你也需要一個(gè)字節(jié)一個(gè)字節(jié)的讀取前面的內(nèi)容。從一個(gè)大文件中找隨機(jī)行的最快的方式是,先找到一個(gè)隨機(jī)位置,然后讀取該位置相對(duì)前后的少數(shù)字節(jié)。

 #-------------------- randline.py ------------------------#
  #!/usr/bin/python
  """Iterate over random lines in a file (req Python 2.2+)
  From command-line use: % randline.py <fname> <numlines>
  """
  import sys
  from os import stat, linesep
  from stat import ST_SIZE
  from random import randrange
  MAX_LINE_LEN = 4096
  #-- Iterable class
  class randline(object):
   __slots__ = ('_fp','_size','_limit')
   def __init__(self, fname, limit=sys.maxint):
    self._size = stat(fname)[ST_SIZE]
    self._fp = open(fname,'rb')
    self._limit = limit
   def __iter__(self):
    return self
   def next(self):
    if self._limit <= 0:
     raise StopIteration
    self._limit -= 1
    pos = randrange(self._size)
    priorlen = min(pos, MAX_LINE_LEN) # maybe near start
    self._fp.seek(pos-priorlen)
    # Add extra linesep at beg/end in case pos at beg/end
    prior = linesep + self._fp.read(priorlen)
    post = self._fp.read(MAX_LINE_LEN) + linesep
    begln = prior.rfind(linesep) + len(linesep)
    endln = post.find(linesep)
    return prior[begln:]+post[:endln]
  #-- Use as command-line tool
  if __name__=='__main__':
   fname, numlines = sys.argv[1], int(sys.argv[2])
   for line in randline(fname, numlines):
    print line

關(guān)于上面的實(shí)現(xiàn),需要注意以下細(xì)節(jié):

(1)在行迭代中,相同的行可能會(huì)被多次選中。當(dāng)然,如果你只是從大文件中選很少行的話,這種情況通常不會(huì)出現(xiàn)。

(2)既然是選中包含隨機(jī)位置的行,那就意味著更 有可能選擇長(zhǎng)的行(譯注:這是為什么?沒有明白)。

本文翻譯自Text Processing in Python

中“PROBLEM: Working with lines from a large file”

以上這篇Python文本處理之按行處理大文件的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一篇文章帶你入門Python正則表達(dá)式

    一篇文章帶你入門Python正則表達(dá)式

    這篇文章主要介紹了Python中正則表達(dá)式的詳細(xì)教程,正則表達(dá)式是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要內(nèi)容,需要的朋友可以參考下
    2021-10-10
  • python機(jī)器人運(yùn)動(dòng)范圍問題的解答

    python機(jī)器人運(yùn)動(dòng)范圍問題的解答

    這篇文章主要為大家詳細(xì)解答了python機(jī)器人的運(yùn)動(dòng)范圍問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • python繪制餅圖的方法詳解

    python繪制餅圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了python繪制餅圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 淺談django框架集成swagger以及自定義參數(shù)問題

    淺談django框架集成swagger以及自定義參數(shù)問題

    這篇文章主要介紹了淺談django框架集成swagger以及自定義參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-07-07
  • Python中的Super用法示例詳解

    Python中的Super用法示例詳解

    Python中可以直接通過調(diào)用父類名調(diào)用父類方法,在多重繼承中,使用super()是一個(gè)很好的習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于Python中Super用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Python Socket庫(kù)基礎(chǔ)方法與應(yīng)用詳解

    Python Socket庫(kù)基礎(chǔ)方法與應(yīng)用詳解

    這篇文章主要介紹了關(guān)于Python socket庫(kù)的詳細(xì)技術(shù)解析,包含基礎(chǔ)方法說明、工作原理剖析,以及多個(gè)應(yīng)用領(lǐng)域的完整實(shí)現(xiàn)代碼,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2025-04-04
  • 使用Python實(shí)現(xiàn)提取PDF文件中指定頁(yè)面的內(nèi)容

    使用Python實(shí)現(xiàn)提取PDF文件中指定頁(yè)面的內(nèi)容

    在日常工作和學(xué)習(xí)中,我們經(jīng)常需要從PDF文件中提取特定頁(yè)面的內(nèi)容,本文主要為大家詳細(xì)介紹了如何使用Python編程語(yǔ)言和兩個(gè)強(qiáng)大的庫(kù)——pymupdf和wxPython來(lái)實(shí)現(xiàn)這個(gè)任務(wù),需要的可以了解下
    2023-12-12
  • 置信橢圓原理以及橢圓圖形繪制方式

    置信橢圓原理以及橢圓圖形繪制方式

    這篇文章主要介紹了置信橢圓原理以及橢圓圖形繪制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python 開發(fā)Activex組件方法

    Python 開發(fā)Activex組件方法

    Python強(qiáng)的功能就在于它無(wú)所不能。
    2009-11-11
  • 利用Tkinter和matplotlib兩種方式畫餅狀圖的實(shí)例

    利用Tkinter和matplotlib兩種方式畫餅狀圖的實(shí)例

    下面小編就為大家?guī)?lái)一篇利用Tkinter和matplotlib兩種方式畫餅狀圖的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧,希望對(duì)大家有所幫助
    2017-11-11

最新評(píng)論

乌拉特中旗| 翼城县| 荆州市| 阳高县| 江达县| 将乐县| 青神县| 金平| 乐清市| 黄山市| 衡东县| 沛县| 宜良县| 洛浦县| 滨州市| 鹿邑县| 五常市| 高密市| 九龙坡区| 江北区| 东阳市| 崇仁县| 丰镇市| 保靖县| 永仁县| 五河县| 民和| 临泉县| 嘉善县| 德兴市| 拉孜县| 锦屏县| 鹤壁市| 南乐县| 林周县| 舟山市| 栾川县| 革吉县| 乌鲁木齐市| 河源市| 岗巴县|