2017-06-19 48 views
0

我想按字符讀取一個30 MB字符的大文件。我發現了一篇關於如何閱讀大文件的有趣文章。 Fast Method to Stream Big files在python中打印二進制數據而不是文本的mmap

問題:輸出打印代替實際人類可讀的文本二進制數據

代碼:

def getRow(filepath): 
    offsets = get_offsets(filepath) 
    random.shuffle(offsets) 
    with gzip.open(filepath, "r+b") as f: 
     i = 0 
     mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ) 
     for position in offsets: 
      mm.seek(position) 
      record = mm.readline() 
      x = record.split(",") 
      yield x 


def get_offsets(input_filename): 
    offsets = [] 
    with open(input_filename, 'r+b') as f: 
     i = 0 
     mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ) 
     for record in iter(mm.readline, ''): 
      loc = mm.tell() 
      offsets.append(loc) 
      i += 1 
    return offsets 

for line in getRow("hello.dat.gz"): 
    print line 

輸出:輸出產生一些奇怪的二進制數據。

['w\xc1\xd9S\xabP8xy\x8f\xd8\xae\xe3\xd8b&\xb6"\xbeZ\xf3P\xdc\x19&H\\@\x8e\x83\x0b\x81?R\xb0\xf2\xb5\xc1\x88rJ\ 

我在做一些非常愚蠢的事情嗎?

編輯:

我發現這個問題。這是因爲gzip.open。不知道如何擺脫這一點。有任何想法嗎?

回答

1

作爲每GZipFile文檔:

fileno(self)

Invoke the underlying file object's `fileno()` method. 

要映射的壓縮.gz文件的視圖,壓縮數據的不是圖。

mmap()只能操作OS文件句柄,它不能映射任意的Python文件對象。

因此,不能透明地映射壓縮文件的解壓縮視圖,除非直接由底層操作系統支持。

+0

感謝您的輸入。我正試圖相應地修改我的方法。 – vkrams

相關問題