Dosyanın yalnızca ilk satırını mı okuyorsunuz?


208

Python ile bir dosyanın dize olarak yalnızca ilk satırını nasıl elde edersiniz?


4
Dosyayı zaten okuduysanız ("Dosyada okuduktan sonra"), ilk satırı zaten okudunuz! (En az bir satır olduğu varsayılarak)
William Pursell

3
Şimdi ifade edilen sorunun başlangıçta olduğundan farklı bir anlamı olduğunu unutmayın. Bazı yanıtlar artık "bir dosyada okuduktan sonra" bölümünü (kaldırılmış olan) dikkate aldıkları için saçma görünüyor.
Peter Hansen

Yanıtlar:


354

.readline()Yöntemi kullanın ( Python 2 belgeleri , Python 3 belgeleri ):

with open('myfile.txt') as f:
    first_line = f.readline()

Bazı notlar:

  1. Dokümanlarda belirtildiği gibi, dosyadaki tek satır olmadıkça, döndürülen dize f.readline()bir satırsonu satırı içerecektir. Bunun f.readline().strip()yerine yeni satırı kaldırmak için kullanmak isteyebilirsiniz .
  2. withİfadesi otomatik olarak yeniden ne zaman blok uçlarını dosyayı kapatır.
  3. Bu withifade yalnızca Python 2.5 ve üstü sürümlerde çalışır ve Python 2.5 sürümündefrom __future__ import with_statement
  4. Python 3'te, açtığınız dosya için dosya kodlamasını belirtmelisiniz. Daha fazla oku...

3
Python 3'te dosya ascii veya utf8 ise dosya kodlamasını belirtmeniz gerekmez. Ve değilse, yine de Python 2'de codecs.open kodlamasını belirtmelisiniz.
Evpok

2
@Evpok "Dosya ascii veya utf8 ise Python 3'te dosya kodlamasını belirtmeniz gerekmez" - yalnızca bu kesinlikle doğruysa! Gerçek biraz daha dağınık; dokümanlarda belirtildiği gibi, kullanılan varsayılan kodlama platforma bağlıdır (ve Python'u nasıl başlattığınıza bağlı olarak aynı bilgisayarda bile farklılık gösterebilir - örneğin, UTF-8'in daha sonra patladığını varsayarak normal kabuğumda çalışan kod gördüm ile Apache üzerinden çalıştırıldığında mod_wsgi).
Mark Amery


20
fline=open("myfile").readline().rstrip()

Buraya bunu aramaya geldim. Özellikle rstrip()yeni satır karakterini kaldırdığı için.
Shashank Sawant

5
1; bu dosyayı kapatmaz ve ilk satır, yeni satır karakterinin yanında herhangi bir boşluk varsa içeriyorsa yanlış bir sonuç döndürür.
Mark Amery

@MarkAmery: Aslında, dosya tanıtıcısı bir değişkene atanmadığından, dosyayı toplayan hemen çöp toplanır. (Tabii ki, bir bağlam yöneticisi kullanarak kabul edilen çözüm hala çok daha iyi.)
acdr

@acdr Söyledikleriniz CPython için doğrudur, ancak diğer Python uygulamaları için geçerli değildir - bkz. örneğin "dosyaların ... kapsam dışına çıktıklarında hemen kapatılmadığı" özel bir ilgi alanı olarak belirtilen PyPy çöp toplama belgeleri . Bu nedenle, tarif ettiğiniz davranışa güvenmenin kötü bir uygulama olduğu genellikle tartışılmaktadır (örn. Stackoverflow.com/a/7396043/1709587 ).
Mark Amery


9

Açık bir dosyanın başlangıcına geri dönüp ilk satırı döndürmek için şunu yapın:

my_file.seek(0)
first_line = my_file.readline()

1
Daha iyi anlamak için, "my_file.seek (0) line = my_file.readline ()"
Alberto Perez


6

Burada başka cevaplar da var, ancak sorduğunuz soruyu tam olarak cevaplamak için (@MarkAmery orijinal soruyu düzenlemeden ve anlamını değiştirmeden önce):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

Başka bir deyişle, dosyayı zaten okuduysanız (dediğin gibi) ve bellekte büyük bir veri bloğuna sahipseniz, ilk satırı verimli bir şekilde almak için, yeni satır karakterine bir kez () bölün. Yalnızca ilk öğeyi sonuç listesinden alın.

Bu \nsatırın sonundaki karakteri içermediğini unutmayın , ancak yine de istemediğinizi varsayıyorum (ve tek satırlı bir dosya bile olmayabilir). Ayrıca, oldukça kısa ve hızlı olmasına rağmen, verilerin bir kopyasını oluşturduğunu unutmayın, bu nedenle gerçekten büyük bir bellek bloğu için "verimli" olarak değerlendiremeyebilirsiniz. Her zaman olduğu gibi, ...


8
Bu büyük bir dosyaysa, f.read () iyi bir fikir olmayacak şekilde tüm dosyayı belleğe yüklemeye çalışır. Alternatif olarak, yeni satır veya EOF ile karşılaşılana kadar her seferinde bir karakter okumak olabilir
randomThought

Aslında, diğer tüm cevaplar bundan daha iyi alternatiflerdir. Normalde readline () ve arkadaşlarıyla bir dosyayı okumak, bir kerede tüm blokları yükler, belki 32K verir veya alır ve bir sonraki yeni satırı bulmak için bunu arar. Çok daha hızlı ve daha verimli. Cevabım sadece her şeyi zaten yüklüyse yararlı olacaktır , bu durumda hepsini hafızada tutmayı iyi olduğunu varsayabiliriz.
Peter Hansen

2
Anlamı değiştirdiğime ikna olmadım. Tüm dosyayı "okuduktan" sonra bir dosyadan ilk satırı nasıl "okuyacağınızı" sormak oldukça anlamsızdır. Böyle olunca asker Nickli Üyenin niyet olduğunu bana oldukça açıktır değil varsaymak .read()ilk çağrılmalıdır.
Mark Amery

@MarkAmery, soru kötü ifade edildi ("oldukça anlamsız"), böylece niyetini tahmin ettiniz ("benim için açık") ve eşleşmesi için yeniden yazdınız. Benim yorumum farklı. Açıkça ve harpalss açıklık sürece, elimizdeki tüm orijinal ifadeler artı bir cevap onun kabul olana kadar (yani "aramaya (0)") açık bir şekilde bana hangi o gösterileri vardı zaten en azından ilk satırında geçen, dosyada okuyun.
Peter Hansen

bu cevabı kaldırmalısınız. doğru yol değildir ve insanları kandırır.
thang

-15
f1 = open("input1.txt", "r")
print(f1.readline())

20
Beş yaşın üzerinde tam olarak bu yaklaşımı içeren birden fazla cevap vardır . Başka bir gürültü ekleyerek gürültü yaratmaktan başka bir şey yapmıyorsunuz.
Mark Amery
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.