Jak odczytać plik tekstowy do zmiennej łańcuchowej i usunąć znaki nowej linii?


962

Korzystam z następującego segmentu kodu, aby odczytać plik w Pythonie:

with open ("data.txt", "r") as myfile:
    data=myfile.readlines()

Plik wejściowy to:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

a kiedy drukuję dane, dostaję

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Jak widzę dane są w listformie. Jak zrobić to ciąg? A także w jaki sposób mogę usunąć "\n", "["i "]"postacie z nim?



7
Tytuł i pytanie są niespójne. Czy naprawdę chcesz się też pozbyć \ n?
Julian

2
czy naprawdę chcesz usunąć znaki nowej linii z zawartości pliku / ciągu, czy po prostu jesteś zdezorientowany wieloma metaznakami na wydruku i faktycznie chcesz zachować znaki nowego wiersza, ale nie wyświetlać ich jako „\ n”?
mnagel

11
Dla tych, którzy przychodzą tutaj z wyszukiwarki, prawdopodobnie szukasz odpowiedzi @ xiaoyu
Jonathan Sudiaman

Odpowiedzi:


1317

Możesz użyć:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')

66
Czy open("data.txt").read().replace('\n','')zamiast tego jest tylko minus ?
tuomassalo

262
Tak, twoja wersja nie zamyka jawnie pliku, który następnie zostanie opóźniony do momentu uruchomienia śmieciarza lub zakończenia programu. Instrukcja „z” zwykle zawiera niektóre działania otwierania / zamykania konfiguracji / usuwania porzucenia.
sleeplessnerd

12
Dziękuję za wyjaśnienie. Wygląda więc na to, że moja wersja może być odpowiednia dla małych skryptów - ale OTOH najlepiej unikać, aby nie stać się nawykiem.
tuomassalo,

10
@tuomassalo jest to ogromna PITA w procesie testowania / debugowania, ponieważ nie wyczyści otwartych uchwytów plików, jeśli musisz przedwcześnie zakończyć działanie lub wystąpi wyjątek.
GoingTharn

13
Nie, rstrip('\n')usunie tylko nowy wiersz z ostatniej linii, replace('\n','')usunie go wszędzie (zasadniczo czyniąc cały plik jedną linią)
sleeplessnerd

630

Użyj read(), a nie readline():

with open('data.txt', 'r') as myfile:
  data = myfile.read()

6
Być może, ale nie usuwa nowych linii tak, jak chciał PO. Jednak nadal mi się podoba.
Randall Cook

60
Jeśli zwracasz pojedynczy ciąg, usuwanie nowych linii nie ma żadnego sensu - OP powinien wybrać jeden ciąg lub usunięty \ n z ciągów na liście.
Alex Dupuy,

Działa, ale nie pliki Unicode. Aby wesprzeć utf8 na python3, użyj dodatkowego argumentuencoding="utf-8"
FindOutIslamNow

2
Nie rozumiem, dlaczego to rozwiązanie zostało opublikowane i zyskuje tak wiele pozytywnych opinii. Zasadniczo jest taki sam jak ten przyjęty ponad rok wcześniej, a nawet brakuje nowej części do zdejmowania linii, co czyni ją jeszcze mniej pomocną ..
nnsense

66

Możesz odczytać z pliku w jednym wierszu:

str = open('very_Important.txt', 'r').read()

Pamiętaj, że nie powoduje to jawnego zamknięcia pliku.

CPython zamknie plik, gdy zostanie zamknięty w ramach odśmiecania.

Ale inne implementacje Pythona nie będą. Aby napisać kod przenośny, lepiej jest użyć withlub zamknąć plik jawnie. Krótki nie zawsze jest lepszy. Zobacz https://stackoverflow.com/a/7396043/362951


32
Jest to antyidiomatyczne i nie jest zalecane. openpowinien być używany w with ... asinstrukcji.
Jorge Leitao

1
@JC czy możesz wyjaśnić problem? Czy to tylko kwestia zwyczaju, czy with ... asoświadczenie coś wnosi?
Titou

4
@To problem polega na tym, że open.read () nie zamyka pliku, więc albo potrzebujemy with ... asalbo str.close()jak pokazano w odpowiedzi Pedro. Więcej o znaczeniu zamykania plików tutaj
JBallin

@JBallin. Ten idiom wyraźnie usuwa źródło błędu. Dzięki !
Titou

3
jest to również złe, ponieważ właśnie str()przesłałeś cień do wbudowanych
Chris_Rands


45

W Pythonie 3.5 lub nowszym za pomocą pathlib możesz skopiować zawartość pliku tekstowego do zmiennej i zamknąć plik w jednym wierszu:

from pathlib import Path
txt = Path('data.txt').read_text()

a następnie możesz użyć str .replace, aby usunąć nowe linie:

txt = txt.replace('\n', '')

31
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

join () dołącza do listy ciągów, a rstrip () bez argumentów przycina białe znaki, w tym znaki nowej linii, od końca ciągów.


12

Można to zrobić za pomocą metody read ():

text_as_string = open('Your_Text_File.txt', 'r').read()

Lub ponieważ sam tryb domyślny to „r” (odczyt), więc po prostu użyj,

text_as_string = open('Your_Text_File.txt').read()

9

Przez jakiś czas się tym bawiłem i wolę używać readw połączeniu z rstrip. Bez rstrip("\n")Python dodaje nową linię na końcu łańcucha, co w większości przypadków nie jest zbyt przydatne.

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print file_content

6

Trudno powiedzieć dokładnie, czego szukasz, ale coś takiego powinno zacząć:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])

redukcja (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") jest znacznie fajniejsze: D
sleeplessnerd

3
@ Duncan, co byś zaproponował?
Chris Eberle,

data = ' '.join(line.replace('\n', '') for line in myfile)lub wersja MagerValp.
Duncan,

6

Dziwię się, że nikt splitlines()jeszcze o tym nie wspomniał .

with open ("data.txt", "r") as myfile:
    data = myfile.read().splitlines()

Zmienna datajest teraz listą, która wygląda tak po wydrukowaniu:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Uwaga: nie ma nowych linii ( \n).

W tym momencie wygląda to tak, jakbyś chciał wydrukować wiersze z powrotem na konsoli, co można osiągnąć za pomocą pętli for:

for line in data:
    print line

4

Możesz także rozebrać każdą linię i połączyć w końcowy ciąg.

myfile = open("data.txt","r")
data = ""
lines = myfile.readlines()
for line in lines:
    data = data + line.strip();

To również zadziałałoby dobrze.


Dzięki Pedro. Właśnie dodałem go w celu zrozumienia.
Sai Kiriti Badam

3

możesz skompresować to w jeden do dwóch wierszy kodu !!!

content = open('filepath','r').read().replace('\n',' ')
print(content)

jeśli twój plik czyta:

hello how are you?
who are you?
blank blank

wyjście Pythona

hello how are you? who are you? blank blank

3

Jest to jedno-liniowe rozwiązanie, które można wkleić i skopiować, a także zamyka obiekt pliku:

_ = open('data.txt', 'r'); data = _.read(); _.close()

2
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print string

2
Pętli, które mają, string += linenależy unikać. Niektóre wersje Pythona mogą tutaj uniknąć zachowania O (n ^ 2), ale każda z pozostałych udzielonych odpowiedzi jest lepsza. Nie usunąłeś również nowych linii, o które prosiłeś, więc twój kod jest po prostu bardzo powolnym sposobemstring = f.read()
Duncan

Dziękuję za poprawienie mnie. Ale jedną małą rzeczą jest to, że nie muszę usuwać nowej linii, ponieważ kiedy testowałem, nie wypisała „\ n”. @Duncan
hungneox

2

python3: „Google Comphrension”, jeśli składnia nawiasu kwadratowego jest dla Ciebie nowa.

 with open('data.txt') as f:
     lines = [ line.strip( ) for line in list(f) ]


1

Nie sądzę, aby ktokolwiek zajął się [] częścią twojego pytania. Kiedy czytasz każdą linię do swojej zmiennej, ponieważ było wiele linii przed zamianą \ n na „”, skończyłeś tworzeniem listy. Jeśli masz zmienną x i wydrukuj ją przed chwilą

x

lub wydrukuj (x)

lub str (x)

Zobaczysz całą listę w nawiasach. Jeśli wywołasz każdy element (tablicy rodzajów)

x [0] następnie pomija nawiasy klamrowe. Jeśli użyjesz funkcji str (), zobaczysz tylko dane, a nie „”. str (x [0])


1

Może mógłbyś tego spróbować? Używam tego w swoich programach.

Data= open ('data.txt', 'r')
data = Data.readlines()
for i in range(len(data)):
    data[i] = data[i].strip()+ ' '
data = ''.join(data).strip()

1

Działa również wyrażenie regularne:

import re
with open("depression.txt") as f:
     l = re.split(' ', re.sub('\n',' ', f.read()))[:-1]

print (l)

[„Ja”, „czuję”, „pusty”, „i”, „martwy”, „wewnątrz”]


1

Aby usunąć podział linii za pomocą Pythona, możesz użyć replace funkcji ciągu.

Ten przykład usuwa wszystkie 3 typy podziałów linii:

my_string = open('lala.json').read()
print(my_string)

my_string = my_string.replace("\r","").replace("\n","")
print(my_string)

Przykładowy plik to:

{
  "lala": "lulu",
  "foo": "bar"
}

Możesz spróbować, korzystając z tego scenariusza powtórki:

https://repl.it/repls/AnnualJointHardware

wprowadź opis zdjęcia tutaj


0

Działa to: zmień plik na:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Następnie:

file = open("file.txt")
line = file.read()
words = line.split()

Spowoduje to utworzenie listy o nazwie wordsrównej:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Pozbyłem się „\ n”. Aby odpowiedzieć na część dotyczącą nawiasów przeszkadzających, po prostu wykonaj następujące czynności:

for word in words: # Assuming words is the list above
    print word # Prints each word in file on a different line

Lub:

print words[0] + ",", words[1] # Note that the "+" symbol indicates no spaces
#The comma not in parentheses indicates a space

Zwraca to:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

1
Zmiana pliku może działać jednorazowo, ale jeśli masz setki plików, to po prostu nie jest wykonalnym rozwiązaniem.
Craicerjack

0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Ten kod pomoże ci przeczytać pierwszy wiersz, a następnie za pomocą opcji listy i podziału możesz przekonwertować słowo pierwszego wiersza oddzielone spacją, aby zapisać je na liście.

Następnie możesz łatwo uzyskać dostęp do dowolnego słowa lub nawet zapisać je w ciągu.

Możesz również zrobić to samo, używając pętli for.


0
file = open("myfile.txt", "r")
lines = file.readlines()
str = ''                                     #string declaration

for i in range(len(lines)):
    str += lines[i].rstrip('\n') + ' '

print str

-1

Spróbuj wykonać następujące czynności:

with open('data.txt', 'r') as myfile:
    data = myfile.read()

    sentences = data.split('\\n')
    for sentence in sentences:
        print(sentence)

Uwaga: nie usuwa \n. Służy tylko do przeglądania tekstu, jakby go nie było\n

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.