中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-02 22:01:16 來源:腳本之家 閱讀:473 作者:aturbofly 欄目:開發技術

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

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

為了讀取整個文件,可能要使用read()方法,且使用字符串的split()來將它拆分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)

如果文件不大,讀取整個文件內容也沒有關系。但如果是大文件,時間和內存就是要重點關注的了。比如,復雜文檔或者活動日志文件,通常有上M,甚至很多G的大小。就算這些文件的內容沒有超出可用內存的尺寸,讀取他們仍然是相當耗時的。

很明顯,如果你需要處理文件的每一行,那就必須讀取整個文件;如果可以按序列處理,xreadlines方法是一種更節約內存的方法。但是對于那些僅僅需要一個大文件的一部分行的應用,要獲得提高其實并不難。對于這一點,模塊“linecache”非常合適。

具有緩存功能的行列表

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

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

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

如果有一個即具有“linecache”的效率,又有列表的一些功能的對象就好了。這個對象不僅可以枚舉和索引,同時還支持切片。

#------------------ 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]

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

  >>> 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

隨機行

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

在大多數系統上,查找一個文件中的特定位置要比讀出該位置前的所有內容直到到達該位置快的多。

就算使用linecache,要到達緩存行,你也需要一個字節一個字節的讀取前面的內容。從一個大文件中找隨機行的最快的方式是,先找到一個隨機位置,然后讀取該位置相對前后的少數字節。

 #-------------------- 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

關于上面的實現,需要注意以下細節:

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

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

本文翻譯自Text Processing in Python

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

以上這篇Python文本處理之按行處理大文件的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

合川市| 天气| 武山县| 贵定县| 梁山县| 景洪市| 长宁县| 封开县| 祁东县| 泗阳县| 山东| 湘乡市| 文水县| 和顺县| 南丹县| 和政县| 黄梅县| 休宁县| 禹州市| 宁波市| 屯昌县| 敖汉旗| 讷河市| 苏尼特左旗| 黄石市| 株洲县| 太和县| 南丰县| 海兴县| 金华市| 巴马| 郴州市| 新沂市| 东至县| 文化| 吐鲁番市| 临桂县| 阳城县| 革吉县| 同江市| 鹤山市|