2013-03-05 12 views
143

Mam plik .txt z wartościami w nim.Pozbycie się n podczas korzystania z .readlines()

Wartości są wymienione tak:

Value1 
Value2 
Value3 
Value4 

Moim celem jest, aby umieścić wartości w liście. Kiedy to zrobić, lista wygląda następująco:

['Value1\n', 'Value2\n', ...]

\n nie jest potrzebne.

Oto mój kod:

t = open('filename.txt', 'r+w') 
contents = t.readline() 

alist = [] 

for i in contents: 
    alist.append(i) 

Odpowiedz

10

dla każdej struny na liście, użyj .strip() który usuwa spacje z początku i końca łańcucha:

for i in contents: 
    alist.append(i.strip()) 

ale w zależności od przypadku użycia możesz lepiej użyć czegoś takiego jak numpy.loadtxt lub nawet numpy.genfromtxt, jeśli potrzebujesz ładnej tablicy danych, które czytasz z pliku.

53

Można użyć .rstrip('\n') do tylko usunąć znaki nowej linii od końca łańcucha:

for i in contents: 
    alist.append(i.rstrip('\n')) 

To pozostawia wszystkie inne białe znaki nienaruszone. Jeśli nie dbasz o białe znaki na początku i na końcu linii, duży ciężki młot nazywa się .strip().

Jednak, ponieważ czytasz z pliku i wciąga wszystko do pamięci mimo to, lepiej użyć str.splitlines() method; to dzieli jeden ciąg znaków na separatory linii i zwraca listę linii bez tych separatorów; korzystać z tego na skutek file.read() i nie używać w ogóle file.readlines():

alist = t.read().splitlines() 
71

bym to zrobić:

alist = [line.rstrip() for line in open('filename.txt')] 

czyli

with open('filename.txt') as f: 
    alist = [line.rstrip() for line in f] 
+6

Można rozebrać więcej niż tylko '\ n'. – gronostaj

+0

Ciągłe spacje (spacja, tabulacja, CR, LF itd.) Nigdy nie są pożądane. Nie ma danych ani języka komputerowego, z którymi miałem do czynienia od ponad dwudziestu lat, które wymagały spóźnienia. Tak, tak, paski są większe niż \ n. Szanse są, nie przegap tego. – hughdbrown

8
from string import rstrip 

with open('bvc.txt') as f: 
    alist = map(rstrip, f) 

Nota Bene: rstrip() usuwa białe znaki, to znaczy: \f, \n , \r, \t, \v, \x i puste ,
, ale przypuszczam, że jesteś zainteresowany tylko utrzymaniem znaczących znaków w liniach. Wtedy tylko map(strip, f) będzie pasował lepiej, usuwając również odstępy nagłówków.


Jeśli naprawdę chcesz, aby wyeliminować tylko NL \n i RF \r symboli zrobić:

with open('bvc.txt') as f: 
    alist = f.read().splitlines() 

splitlines() bez argumentu przekazanego nie utrzymać NL i symboli RF (Windows zapisuje pliki z NLRF na końcu linii, przynajmniej na moim komputerze), ale zachowuje inne spacje, w szczególności puste i tabulatory.

.

with open('bvc.txt') as f: 
    alist = f.read().splitlines(True) 

ma taki sam efekt jak

with open('bvc.txt') as f: 
    alist = f.readlines() 

to znaczy NL i RF są przechowywane

189

ten powinien robić to, co chcesz (zawartość pliku na liście, po linii, bez \ n)

with open(filename) as f: 
    mylist = f.read().splitlines() 
+15

To [nie jest bardzo wydajne pamięci] (http://axialcorps.com/2013/09/27/dont-slurp-how-to-read-files-in-python/). Stąd odpowiedź "dla linii w [obiekcie pliku]". – bfrederix

1

niedawno używane to aby odczytać wszystkie wiersze z pliku:

alist = open('maze.txt').read().split() 

czy można to wykorzystać do tego trochę dodatkowego zwiększenia bezpieczeństwa:

with f as open('maze.txt'): 
    alist = f.read().split() 

To nie działa z białymi znakami w między tekstem w jednej linii, ale to wygląda jak przykład pliku może nie mieć białych znaków dzielących wartości. Jest to proste rozwiązanie, które zwraca dokładną listę wartości i nie dodaje pustego ciągu: '' dla każdej pustej linii, na przykład znaku nowej linii na końcu pliku.

0
with open('D:\\file.txt', 'r') as f1: 
    lines = f1.readlines() 
lines = [s[:-1] for s in lines] 
-1

Najprostszym sposobem, aby to zrobić, to napisać file.readline()[0:-1] To będzie czytać wszystko z wyjątkiem ostatniego znaku, który jest znak nowej linii.

+0

Ostatni znak nie zawsze jest znakiem nowej linii. Możliwe jest utworzenie pliku tekstowego, który nie kończy się znakiem nowej linii (chociaż większość redaktorów posiada jeden). – Flimm

2

Miałem ten sam problem i znalazłem następujące rozwiązanie, aby było bardzo wydajne. Mam nadzieję, że pomoże to Tobie lub każdemu, kto chce zrobić to samo.

Po pierwsze, zacznę od instrukcji "with", ponieważ zapewnia ona prawidłowe otwieranie/zamykanie pliku.

To powinno wyglądać mniej więcej tak:

with open("filename.txt", "r+") as f: 
    contents = [x.strip() for x in f.readlines()] 

Jeśli chcesz przekonwertować te ciągi (każda pozycja w spisie jest ciągiem) w całkowitej lub unosić cię może wykonać następujące czynności:

contents = [float(contents[i]) for i in range(len(contents))] 

Użyj int zamiast float, jeśli chcesz konwertować na liczbę całkowitą.

To jest moja pierwsza odpowiedź w SO, więc przepraszam, jeśli nie jest we właściwym formacie.

+0

'f.read(). Splitlines()' będzie bardziej wydajne, tak myślę. I dla konwersji int lub float, 'map (int, f.read(). Splitlines())' może być lepiej. – thiruvenkadam

1

Po otwarciu pliku, lista zrozumieniem może to zrobić w jednym wierszu:

fh=open('filename') 
newlist = [line.rstrip() for line in fh.readlines()] 
fh.close() 

Wystarczy pamiętać, aby zamknąć plik później.

0

Użyłem funkcji paska, aby pozbyć się znaku nowego wiersza, ponieważ linie podziału powodowały błędy pamięci w pliku 4 gb.

Przykładowy kod:

with open('C:\\aapl.csv','r') as apple: 
    for apps in apple.readlines(): 
     print(apps.strip()) 
Powiązane problemy