ฉันจะระบุบรรทัดใหม่ใน Python เมื่อเขียนไฟล์ได้อย่างไร


313

ในการเปรียบเทียบกับ Java (สตริง) "First Line\r\nSecond Line"คุณจะทำสิ่งที่ชอบ

ดังนั้นคุณจะทำเช่นนั้นใน Python เพื่อจุดประสงค์ในการเขียนหลายบรรทัดไปยังไฟล์ปกติได้อย่างไร


12
คุณลองทำอะไร มันใช้งานได้หรือ (ฉันเดาไม่ได้หรือคุณจะไม่ถาม) เกิดอะไรขึ้น
เกร็กฮิวกิล

ฉันแค่อยากจะรู้ว่ามันมีวิธีที่ถูกต้องและผิดวิธีหรือไม่ฉันยังไม่ได้ลองเลย
FabianCook

5
คุณรู้ไหมว่าprintผลงานของ Python เช่นSystem.out.printlnใน Java และเพิ่มบรรทัดใหม่โดยอัตโนมัติหลังจากข้อความใช่ไหม
Greg Hewgill

ฉันต้องการสำหรับการเขียนไฟล์ :)
FabianCook

2
printคำสั่งในหลามนอกจากนี้ยังสามารถใช้ในการเขียนไปยังไฟล์ (รายละเอียดแตกต่างกันระหว่างหลาม 2.x และ Python 3.x, เพื่อตรวจสอบกับเอกสารอ้างอิงสำหรับรุ่นของคุณ) printใน Python 2.x - printใน Python 3.x
Greg Hewgill

คำตอบ:


357

ขึ้นอยู่กับว่าคุณต้องการถูกต้องแค่ไหน \nมักจะทำงาน ถ้าคุณอยากที่จะได้รับมันขวาคุณมองขึ้นตัวอักษรขึ้นบรรทัดใหม่ในแพคเกจos (เรียกว่าจริงlinesepๆ )

หมายเหตุ: เมื่อเขียนไปยังแฟ้มโดยใช้ Python API, os.linesepไม่ได้ใช้ ใช้เพียง\n; Python แปลว่าเป็นอักขระขึ้นบรรทัดใหม่ที่เหมาะสมสำหรับแพลตฟอร์มของคุณโดยอัตโนมัติ


14
จากลิงก์ที่คุณระบุ "อย่าใช้ os.linesep เป็นตัวยุติบรรทัดเมื่อเขียนไฟล์ที่เปิดในโหมดข้อความ (ค่าเริ่มต้น) ให้ใช้ '\ n' แทนทุกครั้งบนแพลตฟอร์มทั้งหมด" ดังนั้นคุณหมายถึงอะไรโดย "ถูก" และอะไรคือเหตุผลสำหรับพวกเขาและความคิดเห็นของคุณ?
Yasen

21
@Yasen: ใน Windows "\r\n"ลำดับขึ้นบรรทัดใหม่เป็น ซึ่งหมายความว่าจะเป็นos.linesep "\r\n"เมื่อคุณกำลังเขียนไปยังไฟล์ในโหมดข้อความมันจะแปลคำขึ้นบรรทัดใหม่ตามที่เขียน นั่นคือแต่ละ"\n"ผลลัพธ์จะถูกแปล"\r\n"เป็นไฟล์ผลลัพธ์ คุณสามารถดูว่าปัญหานี้เกิดขึ้นได้อย่างไรถ้าข้อความที่คุณเขียนมี"\r\n"ลำดับอยู่แล้ว: ผลลัพธ์จะอยู่"\r\r\n"ที่ท้ายบรรทัดทุกบรรทัด อย่างน้อยฉันก็ไม่ได้ลอง
Nate CK

อาจเป็นเวลาที่จะแก้ไขคำตอบแล้วและลบos.linesepข้อเสนอที่ผิดใช่ไหม? มันจะไม่เป็นละครที่ยิ่งใหญ่และความภาคภูมิใจของผู้เขียนจะไม่ประสบมากฉันเชื่อว่า
ZAB

8
คุณไม่รู้จักความภาคภูมิใจของฉัน แต่ยิ่งจริงจังฉันคิดว่ามันมีประโยชน์ที่จะทราบว่าlinesepมีและมีอยู่เพื่อให้คุณสามารถค้นหาว่าตัวแยกบรรทัดระบบคืออะไร
Charlie Martin

2
@ZAB ไม่ได้เขียนสตริงทั้งหมดลงในไฟล์ในโหมดข้อความ linesepยังคงมีประโยชน์
Kyle Strand

61

\nตัวอักษรบรรทัดใหม่เป็น มันถูกใช้ภายในสตริง

ตัวอย่าง:

    print('First line \n Second line') 

ที่\nเป็นตัวละครขึ้นบรรทัดใหม่

สิ่งนี้จะให้ผลลัพธ์:

First line
 Second line

หากคุณใช้ Python 2 คุณจะไม่ใช้วงเล็บในฟังก์ชั่นการพิมพ์


7
เช่นเดียวกับข้อเสนอแนะถ้าเราไม่ให้ 'ช่องว่างสีขาว' หลังจาก \ n เราจะไม่ได้เยื้องหนึ่งช่องว่างในบรรทัดที่สอง สิ่งที่ฉันหมายถึงคือพิมพ์ 'บรรทัดแรก \ n บรรทัดที่สอง'
Manoj Kumar

ขอบคุณที่ชี้นำให้ใช้อักขระ "\ n" ที่หลบหนีจากสตริง! อาจไม่ชัดเจนสำหรับเด็ก Python ใหม่อย่างฉัน
GrayedFox

3
@ all / any / ManojKumar a = 1; ข = 2; พิมพ์ (มี "\ n" b); o / p: 1 2 (2 อยู่ในบรรทัดใหม่ที่มีช่องว่างสีขาวหนึ่งเยื้องมันไม่ได้ดูอย่างถูกต้อง แต่สมมติว่า 1 และ 2 ในบรรทัดแยกกับเยื้องช่องว่างสีขาวหนึ่งบน 2) ในกรณีนี้ฉันจะลบพื้นที่ whilte ได้อย่างไร เว้นวรรคเยื้อง) ก่อน 2 และจะทำให้เยื้องกับ 1 หมายเหตุ: เราจะไม่ใช้ 2 คำสั่งพิมพ์และ 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

ฉันคิดว่าผลลัพธ์ของคุณไม่ถูกต้องทางเทคนิค บรรทัดที่สองและสามควรพิมพ์โดยมีช่องว่างหนึ่งช่องทางด้านซ้ายของอักขระตัวแรก อีกวิธีคือการลบช่องว่างทั้งสองนี้ออกจากตัวแปรบรรทัด
Christian Westbrook

โค้ดในตัวอย่างที่สองจะไม่สร้างเอาต์พุตที่แน่นอนที่คุณแสดง
Christian Westbrook

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

The \ ที่ตอนท้ายของแต่ละบรรทัดหนีขึ้นบรรทัดใหม่ (ซึ่งจะทำให้เกิดข้อผิดพลาด)


วงเล็บข้างในของคุณดังนั้นจึงไม่จำเป็นต้องใช้การหลบหลีก เพียงแค่จบสตริงย้ายไปที่บรรทัดใหม่และเริ่มใหม่ จะไม่มีบรรทัดใหม่เพิ่มเติมและคุณไม่จำเป็นต้องหลบหนี นอกจากนี้แม้ว่าคุณจะทำตามข้างต้นอักขระบรรทัดใหม่และหลบหนีก็แค่ยกเลิกกัน
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คือ carriage return เมื่อคุณได้รับคุณสมบัติของระบบสำหรับบรรทัดใหม่มันจะปรากฏเป็น\r\n
FabianCook

4
@SmartLemon: อาจเป็นจริงใน Windows แต่ในระบบอื่น ๆ ส่วนใหญ่\nเป็นอักขระขึ้นบรรทัดใหม่
Greg Hewgill

@ Jean-MichaëlCelerier: นั่นเป็นความจริงก่อน Mac OS X. Mac OS X \nใช้
Greg Hewgill

ตกลงฉันจะลบความคิดเห็นของฉันมันไร้ประโยชน์จริงๆแล้ว ขออภัย!
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.....

2

อักขระหลบหนีส่วนใหญ่ในสตริงตัวอักษรจาก Java ยังใช้งานได้ใน Python เช่น "\ r" และ "\ n"


เนื่องจาก Python และ Java ได้รับอิทธิพลจาก C และมาจากภาษานี้ สำหรับข้อมูลเพิ่มเติม
Alex.K.

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!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.