2013-07-20 22 views
5

Tüm bir dosyayı belleğe almayı deniyorum (bitiştirilmiş - StringIO kullanarak) - ancak bu nesneler tam olarak görebildiğim kadar gerçek bir dosya gibi davranmıyor - İçeriğin tamamını aldım ya da bir defada bir satır okumak, ama bu desen uygulamak nasıl çalışamaz: sadece bunu bir disk dosyası gibi bir memoryfile iyileştirilmesi için bir yolu var mıCSV okuyucusu bir bellek dosyasını nasıl okuyacaktır?

import csv 
with open(#MYMEMORYFILE_HERE#, 'rb') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
     for row in spamreader: 

, bu yüzden daha güzel deyimleri kullanabilirsiniz yukarıda?

Python 2.7.4 (default, Apr 19 2013, 18:28:01) 

DÜZENLEME: Bu konuda cevaplar için teşekkürler - Aşağıdaki ben de benimkini ne daralmış düşünüyorum ... ama yine burada bir sorun vardır, değil çıkış bir şey yapmıyor? Kızarma şüphesi var mı?

from csv import reader, writer 
import StringIO 

memfile=StringIO.StringIO() 
spamwriter = writer(memfile) 
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 
spamreader=reader(memfile) 
for row in spamreader: 
     print ', '.join(row) 
memfile.close() 

DÜZENLEME # 2: Ama bence yanlış ağaca havlıyorum: Bu diskteki versiyonu ya da çalışmak için alamadım ('IOError: okumak için açılamıyor Dosya' - ne zaman Zaten açık olan dosyada okumayı çağırıyorum ...) DÜZENLEME # 3: StringIO'yu (gerçek bir gereklilik yok) terk etti - yanıt olarak kullanılan bölünmüş satırlar.

Kodu ve yorumları burada bırakacağım - yararlı olması durumunda. (bir cul-de-sac olmasına rağmen).

spamreader = csv.reader(MYMEMORYFILE_HERE, delimiter=' ', quotechar='|') 

Tüm bu csv.reader() ihtiyaçlarını bir iterable nesnedir: StringIO nesnesini açmak için gerek yoktur

+0

Yıllar sonra, sorunuzu güncellediğinizi görüyorum; güncellemeniz başarısız oldu, çünkü * 0'a geri dönmeyi * unuttun. –

cevap

9

Hafızada bütün bir dosyayı okumak istiyorsanız ve bir metinse, bir StringIO nesnesi açmanıza gerek yoktur. Sadece bir ip olarak okuyun!

with open(filename, 'r') as file: 
    in_memory_file = file.read() 

Sonra üzerine açık bir metin dosyası üzerinde yineleme olurdu yol yineleme için splitlines kullanabilirsiniz.

spamreader = csv.reader(in_memory_file.splitlines(), delimiter=' ', quotechar='|') 
for row in spamreader: 
    pass 
+0

Aslında bu oldukça iyi yapmaya çalıştığımla uyuyor (ilk önce bir disket dosyasından okuyorum ve bellek içi dosyaya kopyaladım) - Bunu bir teşekkür edeceğim - teşekkürler. – monojohnny

+0

Yup - harika - çok geçmeden okuduğumdan beri read() -> readlines() -> açık deyimlerden tümünü unutmuştum :) StringIO overkill'dı! Şerefe – monojohnny

4

, açık bir dosya nesnesi zaten olduğunu. Bir StringIO nesnesi bu gereksinime uyar.

Demo: Kendi StringIO.StringIO testinde gelince

>>> from StringIO import StringIO 
>>> data = StringIO('1,2,3\n4,5,6\n') 
>>> import csv 
>>> for row in csv.reader(data): 
...  print row 
... 
['1', '2', '3'] 
['4', '5', '6'] 

; Bir dosya nesnesine yazdınız ama başlangıçta geri aramayı ihmal ettiniz; Dosya işaretçisi hala sonunda olduğu için hiçbir veri okunmaz. Geriye doğru arama yapın:

memfile.seek(0) 
spamreader=reader(memfile) 
İlgili konular