2013-07-12 11 views
8

:Python turşu listesi, tuple veya başka bir yinelenen veri türü aktarabilir miyim? Ben şöyle görünebilir genellikle virgül/sekme ayrılmış veri dosyaları ile çalışmak

key1,1,2.02,hello,4 
key2,3,4.01,goodbye,6 
... 

böyle, listelerin bir liste halinde Python bu okuma ve ön işlem olabilir:

[ [ key1, 1, 2.02, 'hello', 4 ], [ key2, 3, 4.01, 'goodbye', 6 ] ] 

Bazen, bu liste listemi, girişlerimin farklı türlerini koruduğu için bir turşu olarak kaydetmeyi seviyorum. Eğer seçilmiş dosya büyükse, bu liste listesini akış halinde geri okumak harika olurdu.

import pickle 
with open('big_pickled_list.pkl') as p: 
    for entry in pickle.load_streaming(p): # note: pickle.load_streaming doesn't exist 
     print entry 
:

with open('big_text_file.txt') as f: 
    for line in f: 
     print line 

ben yani bir Python listesi için benzer bir şeyi yapabilir miyim: Python

, bir dere gibi bir metin dosyası yüklemek için, ben her satırın yazdırmak için follwoing kullanmak

"load_streaming" gibi bir turle işlevi var mı?

+1

siz "akış" ne demek istiyorsunuz? ne "giriş" olmak istiyorsun? Ayrıca, kodunuzun, postalandığı gibi, niyetlediğiniz şeyi yapmadığını da unutmayın. 'p' için 'yerine' yerine pkl 'girişi için demek istediniz? – shx2

+0

"Aktarım" ile sanırım bir turşu dosyasını turşu dizisi olarak yinelemek, aynı şekilde bir metin dosyasını satır dizisi olarak yinelemeniz gibi, mata'nın cevabı da. – abarnert

cevap

9

Bu işe yarar. Tüm unpickle ediyorum

import cPickle 
with open('big_pickled_list.pkl') as p: 
    try: 
     while True: 
      print cPickle.load(p) 
    except EOFError: 
     pass 

: nedir

Ne yapabileceğini gibi bir şey olduğunu ancak does dosyadan bir nesne unpickle ve daha sonra stdout

için dosyanın içeriğinin kalanını yazdırmak EOF'ye ulaşana kadar dosyadan nesneler. Eğer for line in f: gibi çalışan bir şey istiyorsanız


, kolayca bu paketleyebilirim: Artık

def unpickle_iter(file): 
    try: 
     while True: 
      yield cPickle.load(file) 
    except EOFError: 
     raise StopIteration 

sadece bunu yapabilirsiniz:

with open('big_pickled_list.pkl') as file: 
    for item in unpickle_iter(file): 
     # use item ... 
+0

Şimdi cevabınızı [contextlib] (http://docs.python.org/2/library/contextlib.html) dekoratörü ile birleştirin ve 'unpickle (dosya adı) ile yapabilirsiniz:' – dawg

+0

@drewk - Yani Yineleyici tamamen tüketilmez veya yinelenen bir istisna kaldırılır ... Evet, bunu özledim. Ama ben bir 'contextlib.contextmanager' burada çok yararlı olacağını düşünmüyorum ve çok daha karmaşık bir çözüm [aslında abarnet tarafından önerilmektedir] (http: // stackoverflow.com/revisions/17623631/2) dosyayı açık bir şekilde içerik yöneticisi olarak açıyor - ben de buna geri dönüyorum. – mata

+0

@mata Hmm, pardon, açık olduğunu sanmıyorum, bu yüzden sorumu düzenledim. Ben genellikle turşu nesnelerim listesi değil, bir dizi turşu nesnesi listesi var. Big_pickled_list içindeki listelerin bir listesi için öneriniz işe yaramıyor. Bununla birlikte, turneyumdaki nesneleri farklı şekilde depolamalı mıyım? – williampli

0

bir yorumun takip etmek için Kabul edilen çözüm üzerinde yaptım, bu gibi bir döngü daha öneririm:

import cPickle 
with open('big_pickled_list.pkl') as p: 
    while p.peek(1): 
     print cPickle.load(p) 

Bu şekilde, dosyada bozuk bir nesne varsa, EOFError istisnasını almaya devam edersiniz. Bütünlüğü için

:

def unpickle_iter(file): 
    while file.peek(1): 
     yield cPickle.load(file) 
İlgili konular