2012-09-08 19 views
192

W Pythonie, nazywającOdczytywanie pliku bez nowej linii

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

wyniki na liście, w którym każdy element jest linia w pliku. To trochę głupie, ale nadal: readlines() również pisze znak nowej linii do każdego elementu, coś, czego nie chcę się wydarzyć. Jak mogę tego uniknąć?

+2

Zastosowanie taśmy: '[l.strip ('\ n \ r') na litr w temperaturze] '. Lub nawet "rstrip". A ponieważ iteracja jest tutaj, może to być 'in open' zamiast' in temp'. – gorlum0

+13

To pytanie jest odpowiedzialne za każdą opinię o reputacji, którą mam – Yotam

+3

Byłoby miło, gdyby w Pythonie 3 istniała wartość do ustawienia argumentu open 'newline' na te chompowane końcowe znaki nowej linii. – jxramos

Odpowiedz

276

można odczytać cały plik i podziel linie używając str.splitlines:

temp = file.read().splitlines() 

Albo można pozbawić przełamane przez strony:

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

Uwaga: to ostatnie rozwiązanie działa tylko wtedy, gdy plik kończy się znakiem nowej linii, w przeciwnym razie ostatnia linia straci znak.

To przypuszczenie jest w większości przypadków prawdziwe (szczególnie w przypadku plików tworzonych przez edytory tekstu, które często do dodają i tak kończący znak nowej linii).

Jeśli chcesz tego uniknąć, można dodać do nowej linii na końcu pliku:

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] 

Albo prostszym rozwiązaniem jest strip znak nowej linii zamiast:

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

Albo nawet, chociaż całkiem nieczytelne:

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

Który wykorzystuje fakt, że va lue z or nie jest wartością boolowską, ale obiektem, który został oceniony jako prawdziwy lub fałszywy.


Sposób readlines jest rzeczywiście równoważne:

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 

Od readline() utrzymuje nowalinia również readlines() utrzymuje ją.

Uwaga: symetrii do readlines() metoda writelines() robi nie dodać kończące znaki nowej linii, więc f2.writelines(f.readlines()) tworzy dokładną kopię f w f2.

+0

Zauważ, że '' [line.rstrip ('\ n') dla wiersza w pliku] '' usunie więcej niż jedno końcowe '' \ n''. –

+0

Po prostu, '' [linia [: - (linia [-1] == '\ n') lub len (linia) +1] dla linii w pliku] '' mógłby zamiast tego być '' [linia [:-(linia [-1] == '\ n') lub Brak] dla linii w pliku] ''. –

+0

Rozwiązania te odczytują cały plik w pamięci. Zmiana nawiasów kwadratowych z rozumienia listy na nawiasy tworzy wyrażenie generatora, które pozwala na iterację po pliku po jednej linii naraz: 'dla linii w (x.strip() dla x w f):' – velotron

19
temp = open(filename,'r').read().split('\n') 
+8

Co by się jednak stało z nowymi wierszami '\ r \ n'? ;) – Wolph

+0

@WoLpH Tak, nie wziąłem pod uwagę newlinii specyficznych dla platformy. To da niewłaściwą rzecz. – vivek

+11

Python automatycznie obsługuje uniwersalne znaki nowej linii, dzięki czemu '.split ('\ n')' zostanie poprawnie podzielone, niezależnie od konwencji nowej linii. Byłoby ważne, jeśli czytasz plik w trybie binarnym. W takim przypadku 'splitlines()' obsługuje uniwersalne znaki nowej linii, natomiast 'split ('\ n')' nie. – Bakuriu

-2
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; 
1
import csv 

with open(filename) as f: 
    csvreader = csv.reader(f) 
    for line in csvreader: 
     print(line[0]) 
2
temp = open(filename,'r').read().splitlines() 
0

Spróbuj:

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

Ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również nie tłumić kodu za pomocą komentarzy wyjaśniających, ponieważ zmniejsza to czytelność zarówno kodu, jak i objaśnień! – FrankerZ

Powiązane problemy