2016-06-28 19 views
14

os module Python chứa một giá trị cho một dòng cụ nền tảng tách chuỗi, nhưng các tài liệu một cách rõ ràng nói không sử dụng nó khi viết vào một tệp:os.linesep là gì?

Không sử dụng os.linesep như một dòng terminator khi ghi tập tin mở ở chế độ văn bản (mặc định); chỉ sử dụng một '\ n' trên tất cả các nền tảng.

Docs

Previous questions đã khám phá lý do tại sao bạn nên không sử dụng nó trong bối cảnh này, nhưng sau đó là nó bối cảnh những gì hữu ích cho? Khi nào bạn nên sử dụng dấu tách dòng và để làm gì?

Trả lời

7

các tài liệu một cách rõ ràng nói không sử dụng nó khi viết vào một tập tin

Đây không phải là chính xác, doc nói không sử dụng nó trong văn bản chế độ.

os.linesep được sử dụng khi bạn muốn lặp qua các dòng của tệp văn bản. Máy quét nội bộ nhận dạng os.linesep và thay thế bằng một "\ n" đơn.

Để minh hoạ, chúng tôi viết một tập tin nhị phân, trong đó có 3 dòng cách nhau dấu "\ r \ n" (Windows delimiter):

import io 

filename = "text.txt" 

content = b'line1\r\nline2\r\nline3' 
with io.open(filename, mode="wb") as fd: 
    fd.write(content) 

Nội dung của tập tin nhị phân là:

with io.open(filename, mode="rb") as fd: 
    for line in fd: 
     print(repr(line)) 

NB: Tôi đã sử dụng chế độ "rb" để đọc tệp dưới dạng tệp nhị phân.

tôi nhận được:

b'line1\r\n' 
b'line2\r\n' 
b'line3' 

Nếu tôi đọc nội dung của tập tin bằng cách sử dụng chế độ văn bản, như thế này:

with io.open(filename, mode="r", encoding="ascii") as fd: 
    for line in fd: 
     print(repr(line)) 

tôi nhận được:

'line1\n' 
'line2\n' 
'line3' 

Delimiter được thay thế bằng "\ n".

Các os.linesep cũng được sử dụng trong chế độ ghi: bất kỳ ký tự "\ n" được chuyển thành các dòng phân cách mặc định hệ thống: "\ r \ n" trên Windows, "\ n" trên POSIX vv

Với chức năng io.open, bạn có thể buộc bộ tách dòng thành bất kỳ thứ gì bạn muốn.

Ví dụ: làm thế nào để viết một file Windows văn bản:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd: 
    fd.write("one\ntwo\nthree\n") 

Nếu bạn đọc tập tin này trong chế độ văn bản như thế này:

with io.open(filename, mode="rb") as fd: 
    content = fd.read() 
    print(repr(content)) 

Bạn nhận:

b'one\r\ntwo\r\nthree\r\n' 
4

Như bạn đã biết, việc đọc và ghi tệp ở chế độ văn bản trong python chuyển đổi tách dòng nền tảng cụ thể thành '\ n' và ngược lại. Nhưng nếu bạn đọc một tệp ở chế độ nhị phân, sẽ không có chuyển đổi nào xảy ra. Sau đó, bạn có thể chuyển đổi một cách rõ ràng các kết thúc dòng bằng cách sử dụng string.replace(os.linesep, '\n'). Điều này có thể hữu ích nếu tệp (hoặc luồng hoặc bất kỳ tệp nào) chứa kết hợp dữ liệu nhị phân và văn bản.

+0

Nó wouldn 't làm việc nếu mã hóa ascii không tương thích. 'len ('\ n'.encode (' utf-16 '))' là 4 –