W Pythonie dzwonienie
temp = open(filename,'r').readlines()
daje listę, w której każdy element jest linią w pliku. Jest to trochę głupie, ale nadal: readlines()
zapisuje także znak nowego wiersza do każdego elementu, czego nie chciałbym wydarzyć.
Jak mogę tego uniknąć?
python
line-breaks
readlines
Yotam
źródło
źródło
[l.strip('\n\r') for l in temp]
. Lub nawetrstrip
. A ponieważ iteracja tutaj może byćin open
zamiastin temp
.newline
argument open na te gryzące końcowe wiersze.Odpowiedzi:
Możesz odczytać cały plik i linie podziału za pomocą
str.splitlines
:Lub możesz ręcznie usunąć nową linię:
Uwaga: to ostatnie rozwiązanie działa tylko wtedy, gdy plik kończy się na nowej linii, w przeciwnym razie ostatnia linia straci znak.
To założenie jest prawdziwe w większości przypadków (szczególnie w przypadku plików utworzonych przez edytorów tekstowych, które często zrobienia dodać kończący znak nowej linii w każdym razie).
Jeśli chcesz tego uniknąć, możesz dodać nowy wiersz na końcu pliku:
Lub prostszą alternatywą jest
strip
zamiast nowej linii:Lub nawet, chociaż dość nieczytelne:
Który wykorzystuje fakt, że zwracana wartość
or
nie jest wartością logiczną, ale obiektem, który został oceniony jako prawda lub fałsz.readlines
Metoda jest rzeczywiście równoważne:Ponieważ
readline()
utrzymuje nową linię, równieżreadlines()
ją utrzymuje.Uwaga: dla symetrii do
readlines()
tejwritelines()
metody jest nie dodać kończące znaki nowej linii, więcf2.writelines(f.readlines())
tworzy dokładną kopięf
wf2
.źródło
[line.rstrip('\n') for line in file]
usuniesz więcej niż jeden końcowy\n
.[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
może zamiast tego być[line[:-(line[-1] == '\n') or None] for line in file]
.for line in (x.strip() for x in f):
with
zamyka pliki po zakończeniu bloku, co oznacza, że nie możesz tego robićwith open(...) as f: lines = (line for line in f)
i używaćlines
poza,with
ponieważ pojawi się błąd we / wy. Możesz być leniwy, używając genexp, ale musisz go zużyć przed zamknięciem pliku.źródło
\r\n
nowymi liniami? ;).split('\n')
podzieli się poprawnie, niezależnie od konwencji nowej linii. Miałoby to znaczenie, jeśli czytasz plik w trybie binarnym. W takim przypadkusplitlines()
obsługuje uniwersalne znaki nowej linii, podczas gdysplit('\n')
nie.os.linesep
:)\r\n
zakończenia linii nie są konwertowane\n
, czy to czytane jako tekstowe, czy binarne, więcos.linesep
działałyby tam, gdzie\n
nie. Alesplitlines
jest wyraźnie lepszym wyborem, w przypadku, gdy wspominasz, gdzie plik nie pasuje do systemu operacyjnego. Naprawdę wspomniałem o tym głównie na wypadek, gdyby ludzie przyglądający się tej dyskusji nie byli świadomi jej istnienia.\r\n
Będą konwertowane na pliki tekstowe, nawet jeśli pracujesz w systemie Linux.inny przykład:
Odczytywanie pliku po jednym wierszu naraz. Usuwanie niechcianych znaków z końca łańcucha
str.rstrip(chars)
patrz także
str.strip([chars])
istr.lstrip([chars])
(python> = 2.0)
źródło
źródło
Myślę, że to najlepsza opcja.
źródło
temp = [line.rstrip() for line in file.readlines()]
aby uzyskać to, co przeznaczone są notatki @Roland_Illig..readlines()
, skutecznie powtarzasz dwukrotnie cały plik.Spróbuj tego:
źródło
źródło
.readlines()
tego w ten sposób, skutecznie iterujesz dwa razy cały plik.źródło
źródło