2011-01-05 59 views
28

Tôi có một tập lệnh python cho đầu ra khác nhau khi chạy trên máy Windows và khi chạy trên máy Mac. Khi đào sâu hơn, tôi phát hiện ra rằng đó là vì khi Python đọc trong ngắt dòng trên máy Mac (từ một tệp), nó đọc trong \r\n, trong khi bằng cách nào đó trong Windows, \r biến mất.Xử lý r n và n dòng mới trong python trên Mac so với Windows

Do đó, nếu tôi thay đổi mỗi \n trong tập lệnh thành \r\n, nó hoạt động tốt trên máy Mac. Nhưng nếu tôi làm điều đó, nó sẽ ngừng hoạt động trên PC Windows.

Có cách nào dễ dàng để khắc phục sự cố này không?

+0

Bạn gặp lỗi này khi đọc từ một tập tin? Bạn đang sử dụng phiên bản python nào? Bạn có nó ở đâu? Python thường được xây dựng với hỗ trợ dòng mới phổ quát – Falmarri

+0

@Falmarri Python 3 ... và tôi chắc chắn rằng tôi đã nhận nó từ trang web chính thức của python – wrongusername

+3

Đây là một sự khác biệt giữa Windows và Linux - trên Windows, hàm glob.glob của Python luôn trả về một danh sách tên tệp, được sắp xếp theo thứ tự abc. Trên Linux, danh sách các tên tập tin được trả về theo thứ tự ngẫu nhiên. – PaulMcG

Trả lời

22

Tôi đoán nó có thể phụ thuộc vào những gì bạn đang đọc, nhưng hàm open() tích hợp có tham số 'chế độ' và nếu bạn chuyển 'U' cho chế độ, Python sẽ xử lý các dòng mới theo cách đa nền tảng một cách minh bạch. Nó đòi hỏi rằng Python được xây dựng với sự hỗ trợ dòng mới, nhưng thử nghiệm nó ra!

http://docs.python.org/library/functions.html#open

+0

Đây cũng là mặc định (theo như tôi biết) – Falmarri

+0

Cảm ơn! Nó hoạt động tốt ngay bây giờ!Oh và @Falmarri xin lỗi, cách duy nhất tôi biết làm thế nào để đọc từ một tập tin là với '' r''. Ít nhất bây giờ tôi biết rõ hơn. – wrongusername

+0

Hmm, có vẻ như đó không phải là mặc định trong python 3. Điều đó có vẻ lạ. – Falmarri

34

Các nền tảng khác nhau có các mã khác nhau cho "dòng mới". Windows có \ r \ n, Unix có \ n, các máy Mac cũ có \ r và có một số hệ thống có \ n \ r.

Khi bạn mở một tệp ở chế độ văn bản bằng Python 3, nó sẽ chuyển đổi tất cả các dòng mới thành '\ n' và được thực hiện với nó.

infile = open("filename", 'r') 

Chế độ văn bản mặc định, vì vậy nếu bạn không nói gì, đó là chế độ văn bản. Nhưng nó luôn luôn tốt hơn để được rõ ràng:

infile = open("filename", 'rt') 

Nếu bạn không muốn bản dịch của kết thúc dòng xảy ra, mở file trong chế độ nhị phân:

infile = open("filename", 'rb') 

Trong Python 2 nó khác nhau. Có chuyển đổi này sẽ chỉ xảy ra theo mặc định trên Windows. Nếu bạn muốn nó xảy ra trên các nền tảng khác, bạn có thể thêm các newline cờ phổ quát:

infile = open("filename", 'rU') 

Tuy nhiên, bạn nói rằng bạn đang trên Python 3, và có nó sẽ xảy ra trong chế độ văn bản trên tất cả nền tảng, do đó, việc thêm cờ U sẽ không tạo ra sự khác biệt nào.

+0

Cảm ơn bạn rất nhiều Tôi đã có một ý tưởng nó như thế, nó đã cho tôi một thời gian khá dài để xác nhận nó, nhưng yeah mã của tôi làm việc trên python 2,7 nhưng glitched trên python 3.2 vì sự khác biệt đó. Tôi cần phải "rb" nó ... cảm ơn, giải thích rất kỹ lưỡng. – sinekonata

+0

'os.linesep' được thay thế bằng' \ n' trong khi đọc ở chế độ văn bản trên * tất cả * nền tảng (không chỉ Windows). Nếu 'os.linesep == '\ n'' thì nó cũng giống như không chuyển đổi trên Python 2. – jfs

+0

@JFSebastian: Thực tế điều đó có nghĩa là nó chỉ xảy ra trên Windows (và Mac OS 9, nhưng nó không được hỗ trợ từ Python 2.4). Trong khi trong Python 3 tất cả các kết hợp dòng mới sẽ được dịch sang ''\ n'' trên tất cả các nền tảng. –

Các vấn đề liên quan