Satırsonu ile ayrılmış dosyaları okumak ve yeni satırları atmak için en iyi yöntem?


84

Python'da satırsonu ile ayrılmış dosyaları okurken satırsonlarından kurtulmanın en iyi yolunu belirlemeye çalışıyorum.

Bulduğum şey şu koddur, test etmek için atılan kod ekleyin.

import os

def getfile(filename,results):
   f = open(filename)
   filecontents = f.readlines()
   for line in filecontents:
     foo = line.strip('\n')
     results.append(foo)
   return results

blahblah = []

getfile('/tmp/foo',blahblah)

for x in blahblah:
    print x

Öneriler?


bölme ("/ n") kullanmaya ne dersiniz?
jle


Bunun yanı dosyayı kapatmak için daha iyi olacağını düşünüyorum
Pawel Prazak

Yanıtlar:


196
lines = open(filename).read().splitlines()

1
Bu cevap aradığımı yapıyor, eminim bazı hata kontrolleri eklemem gerekecek, ama bu özel ihtiyaç için harika. Cevaplar verdiğiniz için hepinize teşekkür ederiz!
solarce

Bunu beğendim ama dosya tanıtıcısını kaydetmezseniz dosyayı nasıl kapatırsınız? Yoksa otomatik olarak mı kapanıyor?
IJ Kennedy

6
CPython ile, dosya nesnesinin referans sayısı artık kullanılmadığında sıfıra gider ve dosya otomatik olarak kapatılır. Jython ve IronPython gibi tamamen GC'lenmiş uygulamalar için dosya, GC çalışana kadar kapatılmayabilir - bu nedenle bu kısa varyasyon optimal olmayabilir.
Curt Hagenlocher

2
8 GB RAM içeren Mac OS X 10.7.5'te, 2047 MB'a kadar dosya okuyabilirim (benim tanımım: 1 MB = 1024 x 1024 bayt). 2048MB MemoryError istisnası atacak.
Hai Vu

1
@WKPlus Mükemmel soru - cevabı "duruma bağlıdır" stackoverflow.com/a/15099341/994153 (CPython referans sayısı sıfıra düştüğü için onu kapatır, ancak diğer Python uygulamaları onu kapatmayabilir, bu yüzden açıkça belirtmek en iyisi )
Colin D Bennett

23

İşte istediğinizi yapan bir jeneratör. Bu durumda, rstrip kullanmak yeterlidir ve stripten biraz daha hızlıdır.

lines = (line.rstrip('\n') for line in open(filename))

Ancak, büyük olasılıkla bunu takip eden boşluklardan da kurtulmak için kullanmak isteyeceksiniz.

lines = (line.rstrip() for line in open(filename))

RHS civarında olması gerekmiyor mu, () değil mi?
andrewb

8
@andrewb () kullanmak, [] (bir liste anlama) kullanmak kadar bellek kullanmayan bir oluşturucu ifadesi verir
Jonathan Hartley

9

Bu yaklaşım hakkında ne düşünüyorsunuz?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

Jeneratör ifadesi, tüm dosyanın belleğe yüklenmesini önler withve dosyanın kapatılmasını sağlar


Bu aslında @ TimoLinna'nın yıllar önce gönderdiği cevabın aynısı ...
martineau

8
for line in file('/tmp/foo'):
    print line.strip('\n')

4

Sadece oluşturucu ifadeleri kullanın:

blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
    print x

Ayrıca, hafızadaki tüm dosyayı okumaya karşı tavsiyede bulunmak istiyorum - üreteçler üzerinden döngü yapmak, büyük veri kümelerinde çok daha etkilidir.


3

Bunu kullanıyorum

def cleaned( aFile ):
    for line in aFile:
        yield line.strip()

O zaman böyle şeyler yapabilirim.

lines = list( cleaned( open("file","r") ) )

Ya da, örneğin boş satırlar bırakmak veya yorum satırlarını atlamak veya her neyse, ekstra işlevlerle temizlenmiş durumu genişletebilirim.


2

Bunu şöyle yapardım:

f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l

Curt Hagenlocher'in cevabı teknik olarak daha iyi olsa da, her satıra başka işlemler eklemeniz gerekiyorsa bu cevap iyi bir başlangıç ​​noktasıdır.
TomOnTime

Boş satırları filtrelemenin amaçlandığından emin değilim, ancak bu, ... if l.strip() is not ''benim durumumda ihtiyacım olan şeyden daha özlü .
Zach Young
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.