Ajout utilitaire pour lire les fichiers ligne par ligne à l'envers.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Wed, 7 Jul 2010 12:24:05 +0000 (12:24 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Wed, 7 Jul 2010 12:24:05 +0000 (12:24 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@276 fe552daf-6dbe-4428-90eb-1537e0879342

src/minwii/backwardsfilereader.py [new file with mode: 0755]

diff --git a/src/minwii/backwardsfilereader.py b/src/minwii/backwardsfilereader.py
new file mode 100755 (executable)
index 0000000..ff89f07
--- /dev/null
@@ -0,0 +1,47 @@
+## {{{ http://code.activestate.com/recipes/439045/ (r2)
+#!/usr/bin/env python
+# -*-mode: python; coding: iso-8859-1 -*-
+#
+# Copyright (c) Peter Astrand <astrand@cendio.se>
+# $Id$
+# $URL$
+
+import string
+
+class BackwardsReader:
+    """Read a file line by line, backwards"""
+
+    def readline(self):
+        while 1:
+            newline_pos = string.rfind(self.buf, "\n")
+            pos = self.file.tell()
+            if newline_pos != -1:
+                # Found a newline
+                line = self.buf[newline_pos+1:]
+                self.buf = self.buf[:newline_pos]
+                if pos != 0 or newline_pos != 0 or self.trailing_newline:
+                    line += "\n"
+                return line
+            else:
+                if pos == 0:
+                    # Start-of-file
+                    return ""
+                else:
+                    # Need to fill buffer
+                    toread = min(self.BLKSIZE, pos)
+                    self.file.seek(-toread, 1)
+                    self.buf = self.file.read(toread) + self.buf
+                    self.file.seek(-toread, 1)
+                    if pos - toread == 0:
+                        self.buf = "\n" + self.buf
+
+    def __init__(self, file, BLKSIZE=4096):
+        self.file = file
+        self.BLKSIZE = BLKSIZE
+        self.buf = ""
+        self.file.seek(-1, 2)
+        self.trailing_newline = 0
+        lastchar = self.file.read(1)
+        if lastchar == "\n":
+            self.trailing_newline = 1
+            self.file.seek(-1, 2)