Як писати символи кінця рядка Unix у Windows?


80

Як я можу писати у файли за допомогою Python (у Windows) та використовувати символ кінця рядка Unix?

наприклад, виконуючи:

f = відкрити ('file.txt', 'w')
f.write ('привіт \ n')
f.close ()

Python автоматично замінює \nна \r\n.

Відповіді:


65

Для Python 2 і 3

Дивіться: Сучасний спосіб: використовуйте відповідь newline = '' саме на цій сторінці.

Лише для Python 2 (оригінальна відповідь)

Відкрийте файл як двійковий файл, щоб запобігти перекладу символів кінця рядка:

f = open('file.txt', 'wb')

Цитування інструкції з Python:

У Windows доданий до режиму 'b' відкриває файл у двійковому режимі, тому існують також такі режими, як 'rb', 'wb' та 'r + b'. Python у Windows розрізняє текстові та двійкові файли; символи кінця рядка в текстових файлах автоматично дещо змінюються при читанні чи записі даних. Ця позакулісна модифікація файлових даних чудово підходить для текстових файлів ASCII, але вона пошкоджує двійкові дані, такі як файли JPEG або EXE. Будьте дуже обережні, використовуючи двійковий режим під час читання та запису таких файлів. У Unix не заважає додавати в режим "b", тому ви можете використовувати його незалежно від платформи для всіх двійкових файлів.


96

Сучасний спосіб: використовувати newline = ''

Використовуйте newline=параметр ключового слова для io.open (), щоб використовувати кінцеві термінатори LF стилю Unix:

import io
f = io.open('file.txt', 'w', newline='\n')

Це працює в Python 2.6+. У Python 3 ви також можете використовувати параметр вбудованої open()функції newline=замість io.open().

Старий спосіб: двійковий режим

Старий спосіб запобігти перетворенню нового рядка, який не працює в Python 3, - це відкрити файл у двійковому режимі, щоб запобігти перекладу символів кінця рядка:

f = open('file.txt', 'wb')    # note the 'b' meaning binary

але в Python 3 двійковий режим буде читати байти, а не символи, тому він не буде робити те, що ви хочете. Ви, мабуть, отримаєте винятки, коли спробуєте зробити рядок вводу-виводу в потоці. (наприклад, "TypeError: 'str' не підтримує інтерфейс буфера").


1
Це допоможе мені, використовуючи це: # newline = '' означає не конвертувати \ n plus.google.com/+PongsametreySOK/posts/2Bg8AdNJCxV
Osify

Ви можете встановити новий рядок як '\n'прямий, це більш чітко, ніж '', і я думаю, що його легше прочитати.
12431234123412341234123

1
@ 12431234123412341234123 Я згоден, використання '\n'є зрозумілішим, ніж ''. Тоді мені не знадобиться коментар, щоб пояснити, що робить код :) Але майте на увазі, що це справедливо лише для написання файлів. Під час читання файлів newline='\n'це не зовсім те саме, що newline='', оскільки readlines()буде розділено лише на \nпопередній випадок, але разом з newline=''цим буде виконувати універсальну обробку нового рядка, але все одно повертатиме фактичні нові рядки з файлу в даних. Дякую за пропозицію! Програма тестування Python
Колін Д Беннетт

Python 3.6+ (можливо, і попередні версії Python3). Якщо ви трохи турбуєтесь про те, що бачили те саме, '\n'що було переключено раніше, ви можете скористатися кодовою точкою Unicode (переконайтеся, що кодування має utf-8 або щось інше). with open('file.txt', 'w', encoding='utf-8', newline='\u000A'); PS Результат нічим не відрізняється від newline='\n'версії, це просто, якщо хтось хоче трохи комфорту.
bballdave025,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.