Jak określić nowe wiersze w Pythonie podczas pisania plików?

313

W porównaniu z Javą (w łańcuchu) zrobiłbyś coś takiego "First Line\r\nSecond Line".

Jak więc zrobiłbyś to w Pythonie, aby zapisać wiele linii do zwykłego pliku?

FabianCook
źródło
12
Czego próbowałeś? Zadziałało? (Chyba nie, bo inaczej nie pytasz.) Co się stało?
Greg Hewgill
Chciałem tylko wiedzieć, czy istnieje dobry i zły sposób, ale jeszcze tego nie próbowałem.
FabianCook
5
Zdajesz sobie sprawę, że Python printdziała jak System.out.printlnw Javie i automatycznie dodaje nowy wiersz po tekście, prawda?
Greg Hewgill
Chcę go do pisania plików :)
FabianCook
2
printOświadczenie w Pythonie może być również używany do zapisu plików (dane różnią się między Pythona 2.x oraz 3.x Pythona, więc sprawdzić docs odniesienia dla swojej wersji). printw Python 2.x - printw Python 3.x
Greg Hewgill

Odpowiedzi:

357

To zależy od tego, jak poprawny chcesz być. \nzwykle wykona zadanie. Jeśli naprawdę chcesz to zrobić dobrze, poszukaj znaku nowej linii w ospakiecie . (To się nazywa linesep.)

Uwaga: podczas pisania do plików przy użyciu API Python nie używaj os.linesep. Po prostu użyj \n; Python automatycznie tłumaczy to na znak nowej linii dla twojej platformy.

Charlie Martin
źródło
14
Z podanego linku „Nie używaj os.linesep jako terminatora linii podczas zapisywania plików otwartych w trybie tekstowym (domyślnie); zamiast tego użyj pojedynczego„ \ n ”na wszystkich platformach.” Co rozumiesz przez „właściwe” i jakie są powody ich i twojego komentarza?
Yasen
21
@Yasen: W systemie Windows sekwencja nowej linii to "\r\n". Oznacza to, że os.lineseptak będzie "\r\n". Kiedy piszesz do pliku w trybie tekstowym, dokonuje on tłumaczenia nowego wiersza podczas pisania; to znaczy, każde "\n"z danych wyjściowych zostanie przetłumaczone na "\r\n"plik wynikowy. Możesz zobaczyć, jak to jest problem, jeśli tekst, który piszesz, już zawiera "\r\n"sekwencje: wynik będzie "\r\r\n"na końcu każdej linii. Przynajmniej zakładam, że tak naprawdę nie próbowałem.
Nate CK,
Może nadszedł czas, aby już naprawić odpowiedź i usunąć niewłaściwą os.lineseppropozycję, nie? To nie byłby duży dramat, a duma autora nie ucierpiałaby zbytnio, jak sądzę
ZAB
8
Nie znasz mojej dumy. Ale poważniej, myślę, że warto zauważyć, że linesepistnieje i istnieje, abyś mógł dowiedzieć się, czym jest separator linii systemowych.
Charlie Martin
2
@ZAB Nie wszystkie ciągi są zapisywane do plików w trybie tekstowym. linesepwciąż może być przydatny.
Kyle Strand
61

Nowy znak linii to \n. Jest używany wewnątrz ciągu.

Przykład:

    print('First line \n Second line') 

gdzie \njest znak nowej linii.

Dałoby to wynik:

First line
 Second line

Jeśli używasz Python 2, nie używasz nawiasów w funkcji drukowania.

python_powered
źródło
7
tak samo jak sugestia, jeśli nie damy „białej spacji” po \ n, nie otrzymamy wcięcia spacji w drugiej linii. miałem na myśli: wydrukuj „Pierwsza linia \ n Druga linia”
Manoj Kumar
Dziękujemy za wskazanie użycia znaku ucieczki „\ n” w ciągu! Być może nie jest to oczywiste dla nowych dzieci Python takich jak ja
GrayedFox
3
@ all / anyone / ManojKumar a = 1; b = 2; print (a, „\ n”, b); o / p: 1 2 (2 jest na nowej linii z jednym wcięciem na białej spacji, nie wygląda poprawnie, ale załóżmy, że 1 i 2 na osobnych liniach z jednym wcięciem na białym spacji na 2) W tym przypadku jak mogę usunąć białe spacje (jedno wcięcie spacji) przed 2 i wprowadzimy wcięcie za pomocą 1. Uwaga: nie użyjemy 2 instrukcji print, a 1 i 2 będą w osobnych (nowych) wierszach.
PRAFUL ANAND
24

Możesz pisać nowe wiersze osobno lub w jednym ciągu, co jest łatwiejsze.

Przykład 1

Wejście

line1 = "hello how are you"
line2 = "I am testing the new line escape sequence"
line3 = "this seems to work"

Możesz napisać „\ n” osobno:

file.write(line1)
file.write("\n")
file.write(line2)
file.write("\n")
file.write(line3)
file.write("\n")

Wynik

hello how are you
I am testing the new line escape sequence
this seems to work

Przykład 2

Wejście

Jak zauważyli inni w poprzednich odpowiedziach, umieść \ n w odpowiednich punktach łańcucha:

line = "hello how are you\nI am testing the new line escape sequence\nthis seems to work"

file.write(line)

Wynik

hello how are you
I am testing the new line escape sequence
this seems to work
Homam Bahrani
źródło
Myślę, że twój wynik jest technicznie niepoprawny. Drugi i trzeci wiersz powinien być wydrukowany z jedną białą spacją na lewo od pierwszych znaków. Innym rozwiązaniem byłoby usunięcie tych dwóch spacji ze zmiennej liniowej.
Christian Westbrook,
W każdym razie kod w drugim przykładzie nie wygeneruje dokładnie tego, co wyświetlasz.
Christian Westbrook,
10

Jeśli wpisujesz kilka wierszy tekstu jednocześnie, uważam, że jest to najbardziej czytelny format.

file.write("\
Life's but a walking shadow, a poor player\n\
That struts and frets his hour upon the stage\n\
And then is heard no more: it is a tale\n\
Told by an idiot, full of sound and fury,\n\
Signifying nothing.\n\
")

\ Na końcu każdej linii ucieka od nowej linii (co spowodowałoby błąd).

Fredcallaway
źródło
Twój wewnętrzny nawias, więc unikanie linii nie jest konieczne. Po prostu zakończ ciąg, przejdź do nowej linii i rozpocznij nową. Nie będzie żadnych nowych nowych linii i nie będziesz musiał uciekać. Ponadto, nawet jeśli zrobiłeś powyższe, nowy znak linii i klawisz ucieczki po prostu się znoszą.
user144153,
9

W Pythonie możesz po prostu użyć znaku nowej linii, tj \n

Mahawke
źródło
3
@maazza: czy nie ma pytania o pisanie ?
mhawke,
9

Najprostsze rozwiązanie

Jeśli zadzwonisz tylko printbez argumentów, wyświetli pusty wiersz.

print

Możesz przesłać dane wyjściowe do pliku takiego jak ten (biorąc pod uwagę twój przykład):

f = open('out.txt', 'w')
print 'First line' >> f
print >> f
print 'Second line' >> f
f.close()

Jest nie tylko niezależny od systemu operacyjnego (nawet bez konieczności korzystania z ospakietu), ale także bardziej czytelny niż wstawianie \nciągów.

Wyjaśnienie

print()Funkcja ma opcjonalny argument wyrażenia koniec sznurka, o nazwie end, która domyślnie znak nowej linii jest system operacyjny, na przykład. \n. Tak więc, kiedy dzwonisz print('hello'), Python drukuje 'hello' + '\n'. Co oznacza, że ​​gdy dzwonisz printbez żadnych argumentów, w rzeczywistości jest drukowany '' + '\n', co powoduje powstanie nowej linii.

Alternatywny

Użyj ciągów wieloliniowych.

s = """First line
    Second line
    Third line"""
f = open('out.txt', 'w')
print s >> f
f.close()
aalaap
źródło
6

Niezależny od platformy wyłącznik linii: Linux, Windows i IOS

import os
keyword = 'physical'+ os.linesep + 'distancing'
print(keyword)

Wynik:

physical
distancing
Bandham Manikanta
źródło
4

W ten sam sposób '\n', choć prawdopodobnie nie potrzebujesz '\r'. Czy istnieje powód, dla którego masz go w swojej wersji Java? Jeśli potrzebujesz / potrzebujesz, możesz używać go w ten sam sposób również w Pythonie.

Levon
źródło
1
\rjest powrót karetki, kiedy otrzymasz właściwość systemową dla nowego wiersza, pojawia się jako\r\n
FabianCook
4
@SmartLemon: Prawdopodobnie tak jest w systemie Windows, ale w większości innych systemów \njest to jedyny znak nowej linii.
Greg Hewgill
@ Jean-MichaëlCelerier: Tak było przed Mac OS X. Mac OS X używa \n.
Greg Hewgill
Ok, usunę mój komentarz, wtedy jest to naprawdę bezużyteczne. Przepraszam!
Jean-Michaël Celerier
4

\ n - działa proste wstawianie znaków nowej linii:

# Here's the test example - string with newline char:
In [36]: test_line = "Hi!!!\n testing first line.. \n testing second line.. \n and third line....."

# Output:
In [37]: print(test_line)

Hi!!!
 testing first line..
 testing second line..
 and third line.....
Surya
źródło
2

Większość znaków zmiany znaczenia w literałach łańcuchowych z języka Java jest również poprawna w języku Python, takich jak „\ r” i „\ n”.

dolaameng
źródło
ponieważ Python i Java były pod wpływem C i przyszło do nich z tego języka. Aby uzyskać więcej informacji .
Alex.K.
1

Jak wspomniano w innych odpowiedziach: „Nowy znak linii to \ n. Jest on używany w ciągu znaków”.

Odkryłem, że najprostszym i najbardziej czytelnym sposobem jest użycie funkcji „format”, używając nl jako nazwy nowego wiersza, i rozbicie ciąg, który chcesz wydrukować, dokładnie do formatu, w którym chcesz go wydrukować:

print("line1{nl}"
      "line2{nl}"
      "line3".format(nl="\n"))

To da wynik:

line1
line2
line3

W ten sposób wykonuje zadanie, a także zapewnia wysoką czytelność kodu :)

Rea Haas
źródło
0

\ n oddziela wiersze ciągu. W poniższym przykładzie zapisuję rekordy w pętli. Każdy rekord jest oddzielony \n.

f = open("jsonFile.txt", "w")

for row_index in range(2, sheet.nrows):

  mydict1 = {
    "PowerMeterId" : row_index + 1,
    "Service": "Electricity",
    "Building": "JTC FoodHub",
    "Floor": str(Floor),
    "Location": Location,
    "ReportType": "Electricity",
    "System": System,
    "SubSystem": "",
    "Incomer": "",
    "Category": "",
    "DisplayName": DisplayName,
    "Description": Description,
    "Tag": tag,
    "IsActive": 1,
    "DataProviderType": int(0),
    "DataTable": ""
  }
  mydict1.pop("_id", None)
  f.write(str(mydict1) + '\n')

f.close()
Sachintha Nayanajith
źródło
0

Warto zauważyć, że podczas sprawdzania łańcucha przy użyciu interaktywnej powłoki pytona lub notatnika Jupyter, \ni inne ciągi odwrócone, takie jak, \tsą renderowane dosłownie :

>>> gotcha = 'Here is some random message...'
>>> gotcha += '\nAdditional content:\n\t{}'.format('Yet even more great stuff!')
>>> gotcha
'Here is some random message...\nAdditional content:\n\tYet even more great stuff!'

Nowe linie, tabulatory i inne specjalne znaki niedrukowane są renderowane jako białe znaki tylko po wydrukowaniu lub zapisaniu w pliku:

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
Trutan
źródło