Как указать новые строки в Python при записи в файлы?


314

По сравнению с Java (в строке), вы бы сделали что-то вроде "First Line\r\nSecond Line" .

Итак, как бы вы сделали это в Python для записи нескольких строк в обычный файл?


12
Что вы пробовали? Это сработало? (Наверное, нет, или вы не спросите.) Что случилось?
Грег Хьюгилл

Я просто хотел знать, есть ли правильный и неправильный способ сделать это, хотя я еще не пробовал.
FabianCook

5
Вы понимаете, что Python printработает как System.out.printlnв Java, и автоматически добавляет новую строку после текста, верно?
Грег Хьюгилл

Я хочу это для записи файлов :)
FabianCook

2
printЗаявление в Python также может быть использовано для записи в файлы (детали отличаются между 2.x Python и Python 3.x, так что проверить с эталонными документами для вашей версии). printв Python 2.x - printв Python 3.x
Грег Хьюгилл

Ответы:


357

Это зависит от того, насколько правильно вы хотите быть. \nбудет обычно делать работу. Если вы действительно хотите понять это правильно, вы ищите символ новой строки в osпакете . (На самом деле это называетсяlinesep .)

Примечание: при записи в файлы с использованием Python API не используйте os.linesep. Просто используйте \n; Python автоматически переводит это на правильный символ новой строки для вашей платформы.


14
По предоставленной вами ссылке «Не используйте os.linesep в качестве ограничителя строки при записи файлов, открытых в текстовом режиме (по умолчанию); вместо этого используйте один \ n на всех платформах». Итак, что вы подразумеваете под «правильным» и каковы причины их и вашего комментария?
Ясен

21
@Yasen: В Windows, символ новой строки последовательность "\r\n". Это значит что os.linesepбудет "\r\n". Когда вы пишете в файл в текстовом режиме, он выполняет перевод новой строки во время записи; то есть каждый "\n"в выводе будет переведен "\r\n"в полученный файл. Вы можете видеть, как это проблема, если текст, который вы пишете, уже содержит "\r\n"последовательности: результат будет "\r\r\n"в конце каждой строки. Я предполагаю, по крайней мере: я на самом деле не пробовал это.
Нейт СК

Может быть, пришло время уже исправить ответ и удалить неправильное os.linesepпредложение? Это не было бы большой драмой, и гордость автора не сильно пострадает, я верю
ZAB

8
Вы не знаете мою гордость. Но если серьезно, я думаю, что полезно отметить, что linesepон существует и существует, чтобы вы могли узнать, что такое системный разделитель строк.
Чарли Мартин

2
@ZAB Не все строки записываются в файлы в текстовом режиме. linesepвсе еще может быть полезным.
Кайл Стрэнд,

63

Символ новой строки \n . Он используется внутри строки.

Пример:

    print('First line \n Second line') 

где \nсимвол новой строки.

Это дало бы результат:

First line
 Second line

Если вы используете Python 2, вы не используете скобки в функции печати.


7
просто как предложение, если мы не дадим «пробел» после \ n, мы не получим один пробел во второй строке. то, что я имел в виду: выведите «Первая строка \ nВторая строка»
Манодж Кумар,

Спасибо за указание использовать экранированный символ "\ n" внутри строки! Возможно, это не очевидно для новых детей Python, таких как я
GrayedFox

3
@ all / any / ManojKumar a = 1; б = 2; печать (а, "\ п", б); o / p: 1 2 (2 находится в новой строке с одним отступом пробела, он не выглядит должным образом, но предположим, что 1 и 2 в отдельных строках с одним отступом пробела 2) В этом случае, как мне удалить пробел (один отступ 2) перед 2 и сделает отступ с 1. Примечание: мы не будем использовать 2 оператора print, а 1 и 2 будут в отдельных (новых) строках.
PRAFUL ANAND

24

Вы можете написать в новых строках отдельно или в одной строке, что проще.

Пример 1

вход

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

Вы можете написать '\ n' отдельно:

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

Вывод

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

Пример 2

вход

Как уже отмечали другие в предыдущих ответах, поместите \ n в соответствующие пункты в вашей строке:

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

file.write(line)

Вывод

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

Я думаю, что ваш вывод технически неверен. Вторая и третья строка должны печататься с одним пробелом слева от их первых символов. Другим решением было бы удалить эти два пробела из строковой переменной.
Кристиан Вестбрук

Во всяком случае, код в примере два не даст точный вывод, который вы отобразили.
Кристиан Вестбрук

10

Если вы вводите несколько строк текста одновременно, я считаю, что это наиболее читаемый формат.

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\
")

\ В конце каждой строки экранирует новую строку (что может привести к ошибке).


Ваша внутренняя скобка, поэтому экранирование не обязательно. Просто завершите строку, перейдите на новую строку и начните новую. Не будет никаких новых новых линий, и вам не нужно будет убегать. Кроме того, даже если вы сделали выше, символ новой строки и escape просто отменяют друг друга.
user144153

9

В Python вы можете просто использовать символ новой строки, т.е. \n


3
@maazza: не вопрос о написании ?
Mhawke

9

Самое простое решение

Если вы вызываете только printбез аргументов, он выведет пустую строку.

print

Вы можете направить вывод в файл, как это (учитывая ваш пример):

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

Он не только не зависит от операционной системы (даже без использования osпакета), но и более читабелен, чем установка\n в строки.

объяснение

print()Функция имеет дополнительный аргумент ключевое слово для конца строки, называется end, который по умолчанию символ новой строки в ОС, для например. \n, Итак, когда вы звоните print('hello'), Python на самом деле печатает 'hello' + '\n'. Это означает, что когда вы звоните просто printбез каких-либо аргументов, это на самом деле печать'' + '\n' , что приводит к переводу строки.

альтернатива

Используйте многострочные строки.

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

6

Независимый от платформы прерыватель строки: Linux, Windows и IOS

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

Вывод:

physical
distancing

4

То же самое с '\n', хотя вам, вероятно, не нужно '\r'. Есть ли причина, по которой он у вас есть в вашей версии Java? Если вам это нужно / нужно, вы можете использовать его таким же образом и в Python.


1
\rвозврат каретки, когда вы получаете системное свойство для новой строки, оно выглядит как\r\n
FabianCook

4
@SmartLemon: Это, вероятно, верно для Windows, но в большинстве других систем \nэто единственный символ новой строки.
Грег Хьюгилл

@ Jean-MichaëlCelerier: это было верно до Mac OS X. Mac OS X использует \n.
Грег Хьюгилл

Хорошо, я удалю свой комментарий, тогда он действительно бесполезен. Сожалею!
Жан-Мишель Селерье

4

\ n - работает простая вставка символа новой строки:

# 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.....


1

Как уже упоминалось в других ответах: «Символ новой строки \ n. Он используется внутри строки».

Я обнаружил, что самый простой и читаемый способ - это использовать функцию «format», используя nl в качестве имени для новой строки, и разбивать строку, которую вы хотите напечатать, до точного формата, который вы собираетесь напечатать:

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

Это будет выводить:

line1
line2
line3

Таким образом, он выполняет задачу, а также дает высокую читаемость кода :)


0

\ n разделяет строки строки. В следующем примере я продолжаю писать записи в цикле. Каждая запись отделяется \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()

0

Стоит отметить, что когда вы проверяете строку с помощью интерактивной оболочки Python или записной книжки Jupyter, \nи другие строки с обратной косой чертой, такие как \t, визуализируются буквально :

>>> 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!'

Символы новой строки, вкладки и другие специальные непечатные символы отображаются как пробелы только при печати или записи в файл:

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.