Як вказати нові рядки на Python під час запису у файли?


313

У порівнянні з Java (в рядку), ви зробили б щось подібне "First Line\r\nSecond Line".

То як би ви це зробили в Python для запису декількох рядків у звичайний файл?


12
Що ви пробували? Це спрацювало? (Гадаю, ні, інакше ви б не питали.) Що сталося?
Грег Хьюгілл

Мені просто хотілося знати, чи є правильний і неправильний спосіб це зробити, але я ще не пробував цього.
FabianCook

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

Я хочу, щоб це писали файли :)
FabianCook

2
Оператор printу Python також може використовуватися для запису у файли (деталі відрізняються між Python 2.x та Python 3.x, тому зверніться до посилальних документів для вашої версії). printу Python 2.x - printу Python 3.x
Greg Hewgill

Відповіді:


357

Це залежить від того, наскільки правильним ви хочете бути. \nзазвичай виконають роботу. Якщо ви дійсно хочете, щоб це було правильно, ви шукаєте символ нового рядка в osпакеті . (Це насправді так називається linesep.)

Примітка: під час запису у файли за допомогою API Python не використовуйте 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"в кінці кожного рядка. Я припускаю, принаймні: я насправді цього не пробував.
Nate CK

Можливо, пора вже виправити відповідь та усунути неправильну os.linesepпропозицію, ні? Це не було б великою драмою, і я вважаю, що авторська гордість не сильно постраждає
ЗАБ

8
Ти не знаєш моєї гордості. Але якщо серйозніше, я вважаю, що корисно зазначити, що linesepіснує та існує, щоб ви могли дізнатися, що таке роздільник системних ліній.
Чарлі Мартін

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

61

Новий символ рядка є \n. Він використовується всередині струни.

Приклад:

    print('First line \n Second line') 

де \nсимвол нового рядка.

Це дасть результат:

First line
 Second line

Якщо ви використовуєте Python 2, ви не використовуєте дужки функції друку.


7
як пропозиція, якщо ми не надаємо "білий пробіл" після \ n, ми не отримаємо один пробіл у другому рядку. що я мав на увазі: надрукувати «Перший рядок \ nдругий рядок»
Маной Кумар

Дякуємо, що вказали на використання втеченої "\ n" знаки у рядку! Можливо, не очевидно для нових дітей Python, як я
GrayedFox

3
@ всі / будь-хто / МанойКумар a = 1; b = 2; друк (a, "\ n", b); o / p: 1 2 (2 знаходиться на новому рядку з одним відступом білого простору, він виглядає не правильно, але припустимо, що 1 і 2 на окремих лініях з одним відступом білого пробілу на 2) У цьому випадку як я видаляю пробіл під час пробілу (один пробіл) перед 2 та зробить відступ з 1. Примітка: ми не будемо використовувати 2 друкованих операторів, а 1 і 2 будуть знаходитись в окремих (нових) рядках.
ПРАФУЛЬНИЙ АНД

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

\ В кінці кожного рядка виходить з нового рядка (що може спричинити помилку).


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

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.
Грег Х'югілл

Гаразд, я видалю свій коментар, тоді це справді марно. Вибачте!
Jean-Michaël Celerier

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. Він використовується всередині рядка".

Я знайшов найпростіший і читабельний спосіб - використовувати функцію "формат", використовуючи 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 або ноутбука Юпітера, \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.