Làm cách nào để chỉ định dòng mới trên Python, khi viết trên tệp?


313

So với Java (trong một chuỗi), bạn sẽ làm một cái gì đó như "First Line\r\nSecond Line".

Vậy làm thế nào bạn sẽ làm điều đó trong Python, với mục đích viết nhiều dòng vào một tệp thông thường?


12
Bạn đã thử những gì? Nó có hoạt động không? (Tôi đoán là không, hoặc bạn sẽ không hỏi.) Chuyện gì đã xảy ra?
Greg Hewgill

Tôi chỉ muốn biết nếu có một cách đúng và sai để làm điều đó, tôi đã không thử nó mặc dù.
FabianCook

5
Bạn có nhận ra rằng Python printhoạt động như System.out.printlntrong Java và tự động thêm một dòng mới sau văn bản, phải không?
Greg Hewgill

Tôi muốn nó để viết tập tin :)
FabianCook

2
Câu printlệnh trong Python cũng có thể được sử dụng để ghi vào các tệp (các chi tiết khác nhau giữa Python 2.x và Python 3.x, vì vậy hãy kiểm tra các tài liệu tham khảo cho phiên bản của bạn). printtrong Python 2.x - printtrong Python 3.x
Greg Hewgill

Câu trả lời:


357

Nó phụ thuộc vào cách bạn muốn trở thành chính xác. \nthường sẽ làm công việc Nếu bạn thực sự muốn làm cho đúng, bạn tìm kiếm ký tự dòng mới trong osgói . (Nó thực sự được gọi linesep.)

Lưu ý: khi ghi vào tệp bằng API Python, không sử dụng os.linesep. Chỉ cần sử dụng \n; Python tự động dịch nó sang ký tự dòng mới phù hợp cho nền tảng của bạn.


14
Từ liên kết bạn đã cung cấp "Không sử dụng os.linesep làm dấu kết thúc dòng khi ghi tệp được mở ở chế độ văn bản (mặc định); thay vào đó hãy sử dụng một '\ n' trên tất cả các nền tảng." Vì vậy, ý của bạn là "đúng" và lý do cho nhận xét của họ và của bạn là gì?
Yasen

21
@Yasen: Trên Windows, trình tự dòng mới là "\r\n". Điều này có nghĩa là os.linesepsẽ được "\r\n". Khi bạn đang ghi vào một tệp ở chế độ văn bản, nó sẽ dịch dòng mới khi nó viết; nghĩa là, mỗi "\n"trong đầu ra sẽ được dịch sang "\r\n"tệp kết quả. Bạn có thể thấy đây là một vấn đề như thế nào nếu văn bản bạn đang viết đã có "\r\n"trình tự: kết quả sẽ "\r\r\n"ở cuối mỗi dòng. Tôi giả sử, ít nhất là: tôi chưa thực sự thử nó.
Nate CK

Có lẽ đã đến lúc sửa câu trả lời và xóa os.linesepđề xuất sai , không? Nó sẽ không phải là một bộ phim lớn và niềm tự hào của tác giả sẽ không phải chịu đựng nhiều như tôi tin
ZAB

8
Bạn không biết niềm tự hào của tôi. Nhưng nghiêm túc hơn, tôi nghĩ thật hữu ích khi lưu ý rằng linesepnó tồn tại và tồn tại để bạn có thể tìm hiểu phân tách dòng hệ thống là gì.
Charlie Martin

2
@ZAB Không phải tất cả các chuỗi được ghi vào tệp ở chế độ văn bản. linesepvẫn có thể hữu ích
Kyle Strand

61

Các nhân vật dòng mới là \n. Nó được sử dụng bên trong một chuỗi.

Thí dụ:

    print('First line \n Second line') 

nơi \nlà kí tự xuống dòng.

Điều này sẽ mang lại kết quả:

First line
 Second line

Nếu bạn sử dụng Python 2, bạn không sử dụng dấu ngoặc đơn trên chức năng in.


7
đúng như một gợi ý, nếu chúng tôi không cung cấp 'khoảng trắng' sau \ n, chúng tôi sẽ không nhận được một khoảng trắng ở dòng thứ hai. ý tôi là: in 'Dòng đầu tiên \ n Dòng thứ hai'
Manoj Kumar

Cảm ơn bạn đã chỉ ra để sử dụng char "\ n" đã thoát bên trong chuỗi! Có lẽ không rõ ràng đối với những đứa trẻ Python mới như tôi
GrayedFox

3
@ tất cả / bất cứ ai / ManojKumar a = 1; b = 2; in (a, "\ n", b); o / p: 1 2 (2 nằm trên dòng mới với một khoảng trắng thụt vào, nó trông không chính xác nhưng giả sử rằng 1 và 2 trên các dòng riêng biệt có một khoảng trắng thụt vào 2) Trong trường hợp này, tôi sẽ xóa khoảng trắng như thế nào (một không gian thụt lề) trước 2 và sẽ thụt lề bằng 1. Lưu ý: chúng tôi sẽ không sử dụng 2 câu lệnh in và 1 và 2 sẽ nằm trên các dòng (mới) riêng biệt.
PRAFUL ANAND

24

Bạn có thể viết riêng các dòng mới hoặc trong một chuỗi đơn, dễ dàng hơn.

ví dụ 1

Đầu vào

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

Bạn có thể viết riêng '\ n':

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

Đầu ra

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

Ví dụ 2

Đầu vào

Như những người khác đã chỉ ra trong các câu trả lời trước, hãy đặt \ n tại các điểm có liên quan trong chuỗi của bạn:

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

file.write(line)

Đầu ra

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

Tôi nghĩ rằng đầu ra của bạn là không chính xác về mặt kỹ thuật. Dòng thứ hai và thứ ba nên in với một khoảng trắng ở bên trái các ký tự đầu tiên của chúng. Một giải pháp khác là loại bỏ hai khoảng trắng này khỏi biến dòng.
Christian Westbrook

Ở bất kỳ giá nào, mã trong ví dụ hai sẽ không tạo ra đầu ra chính xác mà bạn đã hiển thị.
Christian Westbrook

10

Nếu bạn đang nhập một vài dòng văn bản cùng một lúc, tôi thấy đây là định dạng dễ đọc nhất.

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

\ Ở cuối mỗi dòng thoát khỏi dòng mới (sẽ gây ra lỗi).


Dấu ngoặc đơn bên trong của bạn, vì vậy các dòng thoát là không cần thiết. Chỉ cần kết thúc chuỗi, di chuyển đến một dòng mới và bắt đầu một chuỗi mới. Sẽ không có thêm dòng mới nào và bạn sẽ không cần phải thoát. Ngoài ra, ngay cả khi bạn đã làm như trên, nhân vật dòng mới và thoát chỉ cần hủy bỏ nhau.
user144153

9

Trong Python, bạn chỉ có thể sử dụng ký tự dòng mới, tức là \n


3
@maazza: không phải là câu hỏi về viết lách ?
mhawke

9

Giải pháp đơn giản nhất

Nếu bạn chỉ gọi printmà không có bất kỳ đối số, nó sẽ xuất ra một dòng trống.

print

Bạn có thể chuyển đầu ra thành một tệp như thế này (xem xét ví dụ của bạn):

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

Không chỉ là hệ điều hành (không cần phải sử dụng osgói), nó còn dễ đọc hơn việc đặt\n trong chuỗi.

Giải trình

Các print()chức năng có một cuộc tranh cãi từ khóa tùy chọn cho sự kết thúc của chuỗi, được gọi là end, mặc định là ký tự xuống dòng của hệ điều hành, cho ví dụ. \n. Vì vậy, khi bạn gọi print('hello'), Python thực sự đang in 'hello' + '\n'. Điều đó có nghĩa là khi bạn gọi printmà không có bất kỳ đối số nào, nó thực sự đang in'' + '\n' , dẫn đến một dòng mới.

Thay thế

Sử dụng chuỗi nhiều dòng.

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

6

Trình ngắt dòng độc lập với nền tảng: Linux, windows & IOS

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

Đầu ra:

physical
distancing

4

Cùng một cách với '\n', mặc dù bạn có thể không cần '\r'. Có một lý do bạn có nó trong phiên bản Java của bạn? Nếu bạn cần / muốn nó, bạn cũng có thể sử dụng nó theo cách tương tự trong Python.


1
\rlà tiền vận chuyển, khi bạn nhận được thuộc tính hệ thống cho dòng mới, nó sẽ xuất hiện dưới dạng\r\n
FabianCook

4
@SmartLemon: Điều đó có thể đúng trên Windows, nhưng trên hầu hết các hệ thống khác \nlà ký tự dòng mới duy nhất.
Greg Hewgill

@ Jean-MichaëlCelerier: Điều đó đúng trước khi Mac OS X. Mac OS X sử dụng \n.
Greg Hewgill

Ok, tôi sẽ xóa bình luận của tôi, nó thực sự vô dụng sau đó. Lấy làm tiếc!
Jean-Michaël Celerier

4

\ n - công việc chèn ký tự dòng mới đơn giả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

Hầu hết các ký tự thoát trong chuỗi ký tự từ Java cũng hợp lệ trong Python, chẳng hạn như "\ r" và "\ n".


bởi vì Python và Java bị ảnh hưởng bởi C và nó đến với họ từ ngôn ngữ này. Để biết thêm thông tin .
Alex.K.

1

Như đã đề cập trong các câu trả lời khác: "Ký tự dòng mới là \ n. Nó được sử dụng bên trong một chuỗi".

Tôi thấy cách đơn giản và dễ đọc nhất là sử dụng chức năng "định dạng", sử dụng nl làm tên cho dòng mới và ngắt chuỗi bạn muốn in thành định dạng chính xác mà bạn sẽ in:

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

Điều đó sẽ xuất ra:

line1
line2
line3

Bằng cách này, nó thực hiện nhiệm vụ và cũng cho khả năng đọc mã cao :)


0

\ n tách các dòng của một chuỗi. Trong ví dụ sau, tôi tiếp tục viết các bản ghi trong một vòng lặp. Mỗi bản ghi được phân tách bằng \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

Đáng lưu ý rằng khi bạn kiểm tra một chuỗi bằng cách sử dụng trình bao trăn tương tác hoặc sổ ghi chép Jupyter, \ncác chuỗi bị gạch chéo ngược khác như \tđược hiển thị theo nghĩa đen :

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

Các dòng mới, tab và các ký tự không in đặc biệt khác được hiển thị dưới dạng khoảng trắng chỉ khi được in hoặc ghi vào tệp:

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.