Soru Python'da, bir dosya satırını bir listeye nasıl okurum?


Python'daki bir dosyanın her satırını nasıl okurum ve her satırı bir listede bir öğe olarak depolarım?

Dosya satırını satırdan okumak ve her satırı listenin sonuna eklemek istiyorum.


1703
2017-07-18 22:25


Menşei




Cevaplar:


with open(fname) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 

1659
2017-07-18 22:28



Kullanma file.readlines() içinde for-loop, bir dosya nesnesinin kendisi yeterlidir: lines = [line.rstrip('\n') for line in file] - jfs
Büyük Veri ile çalışıyorsanız readlines() sonuç olarak çok verimli değildir MemoryError. Bu durumda kullanarak dosya üzerinde yineleme daha iyidir for line in f: ve her biri ile çalışmak line değişken. - DarkCygnus
Bahsedilen prosedürü kullanarak cevaplarda verilen farklı şekillerin hafıza profilini kontrol ettim İşte. @DevShark tarafından önerilen şekilde, her satır dosyadan okunduğunda ve işlendiğinde bellek kullanımı çok daha iyidir. İşte. Tüm satırları koleksiyon nesnesinde tutmak değil Bellek bir kısıtlama veya dosya büyükse iyi bir fikir. Uygulama süresi, her iki yaklaşımda da benzerdir. - Tirtha R
Ayrıca, .rstrip() satırların uçlarından boşlukları sıyırıyorsanız biraz daha hızlı çalışacaktır. - Gringo Suave


Görmek Giriş ve Çıkış:

with open('filename') as f:
    lines = f.readlines()

veya yeni satır karakterini sorarak:

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

Editörün notu: Bu yanıtın orijinal boşluk bırakma komutu, line.strip()Janus Troelsen'in yorumunun ima ettiği gibi, tüm lider ve takip boşluk, sadece sondaki değil \n.


781
2017-07-18 22:28



sadece yeni satırı atmak istiyorsan: lines = (line.rstrip('\n') for line in open(filename)) - Janus Troelsen
Bir liste için olmalı lines = [line.rstrip('\n') for line in open(filename)] - Lazik
2. seçenek dosyayı açık bırakmaz (kendi başına bir bağlam tarafından korunmadığı için)? - yo'
@yo 'Yapıyor, ama çoğu insan küçük programlarda bunu umursamıyor. Sızan dosya nesnesi çöp toplandığından, küçük programlarda hiçbir zarar yoktur, ancak bunu yapmak iyi bir alışkanlık değildir. - Martin Ueding
Daha güvenli: with open('filename') as f: lines = [line.rstrip('\n') for line in f] - becko


Bu, gerekli olandan daha açık, ama istediğini yapıyor.

with open("file.txt", "r") as ins:
    array = []
    for line in ins:
        array.append(line)

369
2017-07-18 22:27



Bu soruya doğrudan bir cevap - Joop


Bu, dosyadan bir "dizi" satırı verecektir.

lines = tuple(open(filename, 'r'))

206
2017-07-18 22:27



open Yinelenebilecek bir dosya döndürür. Bir dosya üzerinde yinelediğinizde, bu dosyadan satırları alırsınız. tuple Bir yineleyici alabilir ve verdiğiniz yineleyiciden sizin için bir tuple örneğini başlatabilirsiniz. lines dosya satırlarından oluşturulan bir tupledır. - Noctis Skytower
@MarshallFarrier Dene lines = open(filename).read().split('\n') yerine. - Noctis Skytower
dosyayı kapatır mı? - Vanuan
@NoctisSkytower buldum lines = open(filename).read().splitlines() biraz daha temiz, ve ben de DOS satır sonlarını daha iyi idare edeceğine inanıyorum. - jaynp
@ mklement0 1000 satırlık bir dosya varsayarsak, list yaklaşık% 13.22 daha fazla yer kaplar tuple. Sonuçlar from sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2). Yaratmak tuple bir oluşturmadan yaklaşık% 4.17 daha fazla zaman alır list (% 0.16 standart sapma ile). Sonuçlar koşmaktan geliyor from timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2) 30 kere. Benim çözümüm, mutabilite ihtiyacı bilinmediği zaman, hızın üzerinde bir yer tutuyor. - Noctis Skytower


Eğer istersen \n dahil:

with open(fname) as f:
    content = f.readlines()

Eğer istemiyorsanız \n dahil:

with open(fname) as f:
    content = f.read().splitlines()

150
2018-03-02 04:22





Önerildiği gibi sadece aşağıdakileri yapabilirsiniz:

with open('/your/path/file') as f:
    my_lines = f.readlines()

Bu yaklaşımın 2 olumsuz tarafı olduğunu unutmayın:

1) Tüm satırları hafızaya kaydedersiniz. Genel durumda, bu çok kötü bir fikir. Dosya çok büyük olabilir ve hafızanız bitti. Büyük olmasa bile, sadece bir hafıza kaybıdır.

2) Bu, okuduğunuz her satırın işlenmesine izin vermez. Dolayısıyla, eğer satırlarınızı bu işlemden geçirirseniz, verimli değildir (bir yerine iki geçiş gerektirir).

Genel durum için daha iyi bir yaklaşım aşağıdaki gibi olacaktır:

with open('/your/path/file') as f:
    for line in f:
        process(line)

Süreç işlevinizi istediğiniz şekilde tanımlarsınız. Örneğin:

def process(line):
    if 'save the world' in line.lower():
         superman.save_the_world()

(Uygulamanın Superman sınıf sizin için bir egzersiz olarak bırakılmıştır).

Bu, herhangi bir dosya boyutu için güzel bir şekilde çalışacaktır ve dosyanıza yalnızca 1 geçişte geçersiniz. Bu genellikle, genel ayrıştırıcıların nasıl çalışacağıdır.


93
2018-02-25 09:13



Bu tam ihtiyacım olan şeydi - ve dezavantajları açıkladığın için teşekkürler. Python'da yeni başlayan bir kişi olarak, çözümün neden çözüm olduğunu anlamak harika bir şey. Şerefe! - Ephexx
Biraz daha düşün, Corey. Bu satırlarda hiç bir şey yapmadan, bilgisayarınızın her satırı okumasını gerçekten istiyor musun? Şüphesiz, her zaman onları bir şekilde işlemek zorunda olduğunun farkına varabilirsin. - DevShark
Her zaman çizgilerle bir şeyler yapmalısın. Çizgileri yazdırmak veya saymak kadar basit olabilir. Prosesinizin hafızada satırları okumasına, ancak onunla hiçbir şey yapmamaya dair bir değer yoktur. - DevShark
Her zaman onlarla bir şeyler yapmalısın. Yapmaya çalıştığınız nokta bence, hepsine tek bir işlev yerine tek bir işlev uygulamak isteyebilirsiniz. Bu bazen de durum böyle. Fakat bunu yapmak için bellek açısından çok verimsizdir ve ayak izi Ram'ınızdan daha büyükse dosyaları okumayı engeller. Bu yüzden genel olarak jenerik ayrıştırıcılar anlattığım şekilde çalışır. - DevShark
@PierreOcinom bu doğru. Dosya salt okunur modda açıldığında, orijinal dosyayı yukarıdaki kodla değiştiremezsiniz. Hem okuma hem de yazma için bir dosya açmak open('file_path', 'r+') - DevShark


Dosyayı kapatmayla ilgilenmezseniz, bu tek liner çalışır:

lines = open('file.txt').read().split("\n")

geleneksel yol:

fp = open('file.txt') # Open file on read mode
lines = fp.read().split("\n") # Create a list containing all lines
fp.close() # Close file

kullanma with (Tavsiye edilen):

with open('file.txt') as fp:
    lines = fp.read().split("\n")

61
2018-04-20 05:53



Bazı durumlarda iyi olabilir, ancak bu, döngü tamamlandıktan sonra bile dosyayı kapatmaz - stackoverflow.com/a/1832589/232593 - Merlyn Morgan-Graham
with blok dosyayı otomatik olarak kapatır. Final için gerek yok fp.close() Son örnekte satır. Görmek: repl.it/IMeA/0 - Merlyn Morgan-Graham
Her zaman dosyayı kapatmaya özen göster! İyi bir kaynak vatandaşı ol! - Nick