2014-04-18 9 views
2

問題是我只能讀取InputFile.bak文件的第一行。我如何使用cPickle從文件中讀取所有信息。使用Python讀取文件中的數據cPickle

輸入文件InputFile.bak

(dp1 
S'Here we go' 
p2 
(cdatetime 
date 
p3 
(S'\x07\xdc\x0c\x0c' 
tRp4 
cdatetime 
time 
p5 
(S'\x0c\x0c\x00\x00\x00\x00' 
tRp6 
tp7 
s.(dp1 
S'Here we go' 
p2 
(cdatetime 
date 
p3 
(S'\x07\xdc\x0c\x0c' 
tRp4 
cdatetime 
time 
p5 
(S'\x0c\x0c\x00\x00\x00\x00' 
tRp6 
tp7 
s.(dp1 
S'Here we go' 
p2 
(cdatetime 
date 
p3 
(S'\x07\xdc\x0c\x0c' 
tRp4 
cdatetime 
time 
p5 
(S'\x0c\x0c\x00\x00\x00\x00' 
tRp6 
tp7 
sS'Google Searching' 
p8 
(g3 
(S'\x07\xdc\x0c\x0b' 
tRp9 
g5 
(S'\x01\x17\x00\x00\x00\x00' 
tRp10 
tp11 
s. 

源代碼

import time 
import datetime 
import cPickle 
import os 
from sys import exit 


def read_file(): 
    if os.path.exists('InputFile.bak'): 
     try: 
      fname = open('InputFile.bak', 'rb') 
      file_src = cPickle.Unpickler(fname) 
      item_name = file_src.load() 
      for k, v in item_name.iteritems(): 
       print v[0], "\t", v[1],"\t", k 
     finally: 
      fname.close() 
    else: 
     item_name = {} 

if __name__ == '__main__': 
    read_file() 

非常感謝你。

回答

1

您可以使用loop來獲取所有記錄。

def read_file(): 
    if os.path.exists('InputFile.bak'): 
     # try: 
     with open('InputFile.bak', 'rb') as fname: 
      while True: 
       try: 
        item_name = cPickle.load(fname) 
        for k, v in item_name.iteritems(): 
         print v[0], "\t", v[1],"\t", k 
       except EOFError: 
        break 
    else: 
     item_name = {} 

if __name__ == '__main__': 
    read_file() 
+2

我有以下錯誤 回溯(最近呼叫最後): 文件「ReadFromFile.py」,第9行,在 item_name = cPickle.load(fname) cPickle.UnpicklingError:無效加載密鑰' '。 – J4cK

+0

但我可以跑。我更新所有代碼以讓您嘗試。 –

+0

哦...我知道。因爲你的'InputFile.bak'在第一行有一個空格。刪除它們。 –

1

如果你知道另一個進程將不會被添加到該文件,而你正在閱讀它,你可以檢查對文件大小的當前進度:

def read_file(): 
    fname = 'InputFile.bak' 
    if os.path.exists(fname): 
     fsize = os.path.getsize(fname) 
     with open(fname, 'rb') as fh: 
      while fh.tell() < fsize: 
       item = cPickle.load(fh) 
       for k, v in item.iteritems(): 
        print v[0], "\t", v[1],"\t", k 
    else: 
     item_name = {}