Yeni satır içermeyen bir dosya nasıl okunur?


374

Python'da

temp = open(filename,'r').readlines()

her öğenin dosyada bir satır olduğu bir liste ile sonuçlanır. Biraz aptal ama yine de: readlines()her bir öğeye yeni satır karakteri yazıyor, olmasını istemediğim bir şey.

Nasıl önleyebilirim?


4
Kullanım şerit: [l.strip('\n\r') for l in temp]. Hatta rstrip. Ve burada yinelemeden beri in openbunun yerine olabilir in temp.
gorlum0

11
Python 3'te, açılmış newlineargümanı o boğulmuş sondaki yeni satırlara ayarlamak için bir değer olsaydı iyi olurdu .
jxramos

Yanıtlar:


554

Aşağıdakileri kullanarak tüm dosyayı okuyabilir ve satırları bölebilirsiniz str.splitlines:

temp = file.read().splitlines()

Veya satırsonu satırını elle kapatabilirsiniz:

temp = [line[:-1] for line in file]

Not: Bu son çözüm yalnızca dosya yeni satırla bitiyorsa çalışır, aksi takdirde son satır bir karakteri kaybeder.

Bu varsayım genellikle özellikle metin editörleri tarafından oluşturulan dosyalar için çoğu durumda (içinde geçerlidir do zaten bir bitiş yeni satır ekleyin).

Bundan kaçınmak istiyorsanız, dosyanın sonuna yeni satır ekleyebilirsiniz:

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

Ya da stripbunun yerine yeni satıra daha basit bir alternatif :

[line.rstrip('\n') for line in file]

Ya da oldukça okunamaz olmasına rağmen:

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

Bu, dönüş değerinin orbir boolean değil, doğru veya yanlış olarak değerlendirilen nesneden yararlanır.


readlinesYöntem aslında eşdeğerdir:

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

Çünkü readline()yeni satır da readlines()tutar.

Not: için simetri için yöntemiyle yok değil yeni satır biten eklemek, bu nedenle tam bir kopyasını üretir içinde .readlines()writelines()f2.writelines(f.readlines())ff2


1
[line.rstrip('\n') for line in file]Birden fazla izlemeyi kaldıracağını unutmayın \n.
Wes Turner

1
Daha basit, [line[:-(line[-1] == '\n') or len(line)+1] for line in file] bunun yerine olabilir [line[:-(line[-1] == '\n') or None] for line in file].
Wes Turner

10
Bu çözümler dosyanın tamamını belleğe okur. Liste kavrayışının köşeli parantezlerini parantez olarak değiştirmek, dosya üzerinde her defasında bir satır yinelemenize olanak tanıyan bir üretici ifadesi oluşturur: for line in (x.strip() for x in f):
Joseph Sheedy

2
@velotron Bu gerçekten sorunun / cevabın konusu değil. Ayrıca: withblok sona erdiğinde dosyaları kapatacağınızı ve bunun dışında bir G / Ç hatası alacağınız için with open(...) as f: lines = (line for line in f)kullanamayacağınızı ve kullanamayacağınızı unutmayın. Bir genexp kullanarak tembel olabilirsiniz, ancak dosyayı kapatmadan önce tüketmelisiniz. lineswith
Bakuriu

@WesTurner. Ancak birden fazla sondaki yeni satır olmayacak. Ek satırsonu sıradaki boş satırın bir parçası olacak
Mad Physicist

38
temp = open(filename,'r').read().split('\n')

14
Yeni \r\nsatırlara ne olur? ;)
Wolph

26
Python evrensel yeni satırları otomatik olarak işler, böylece .split('\n')yeni satır kuralından bağımsız olarak doğru şekilde bölünür. Dosyayı ikili modda okumanız önemli olacaktır.Bu durumda splitlines()evrensel yeni satırları işlerken split('\n'), kullanmaz.
Bakuriu

7
Ve her zaman var os.linesep:)
askewchan

1
Benim sistem üzerinde @LarsH, bu bazı durumlarda yardımcı olacağını \r\nsatır sonları edilir değil dönüştürüldü \nyüzden, metin veya ikili olarak okuyup okumadığını, os.linesepnerede çalışacak \ndeğildir. Ancak splitlines, dosyanın işletim sistemi ile eşleşmediği durumlarda, daha iyi bir seçimdir. Gerçekten, bu tartışmaya bakan insanların varlığından habersiz olmalarından bahsetmiştim.
askewchan

1
@askewchan Belki de Python'un eski bir sürümünü kullanıyorsunuz. Python 3 itibariyle, evrensel yeni satırların varsayılan olarak etkinleştirildiğine, yani \r\nLinux üzerinde çalışırken bile metin dosyaları için dönüştürüleceğine inanıyorum.
Arthur Tacca

13

başka bir örnek:

Dosya her seferinde bir satır okunuyor. Dizenin sonundan itibaren istenmeyen karakterleri kaldırmastr.rstrip(chars)

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print( row.rstrip('\n') )

ayrıca bakınız str.strip([chars])vestr.lstrip([chars])

(python> = 2.0)


10
temp = open(filename,'r').read().splitlines()

5
Bunun dosyayı kapattığından emin misiniz? Bence öyle değil, bu yüzden gerçekten bir astar değil ...
Ray Hulha

9

Bence bu en iyi seçenek.

temp = [line.strip() for line in file.readlines()]

8
Bu çözüm aynı zamanda amaçlanmayan öndeki ve arkadaki boşlukları da kaldırır.
Roland Illig

Anlayış gerçekten güzel. En azından Python 3 ile, temp = [line.rstrip() for line in file.readlines()]@Roland_Illig notlarının amaçlandığı şeyi elde etmek için kullanılabilir .
bballdave025

Eğer tüm çizgileri yineleyecekseniz, neden bu kadar tembellik etmiyorsunuz? İle .readlines(), tüm dosyayı etkin bir şekilde iki kez yinelersiniz.
AMC

1

Bunu dene:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

4
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen hem kodun hem de açıklamaların okunabilirliğini azalttığı için kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın!
Hoşçakal StackExchange

Kimsenin bunu neden bazı alternatif çözümlerde kullanması gerektiğini anlamıyorum.
AMC

-1
my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 

3
Lütfen başkalarına faydalı olması için bir açıklama ekleyin.
samuellawrentz

Dosya nesnesini işlemek için bir bağlam yöneticisi kullanmalı ve doğrudan dosya üzerinden yinelemelisiniz. Bu şekilde kullanarak .readlines(), tüm dosyayı etkin bir şekilde iki kez yinelersiniz.
AMC

-2
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

2
Peki ya çizginin içinde virgül varsa?
gilch

-8
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;


def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set


for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
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.