Найти - Пользователи
Полная версия: Не работает переход на новую строку
Начало » Python для новичков » Не работает переход на новую строку
1
XPb14
Имеется следующий код
	
for i in range(len(projects_list)):
	projects_list[i] = u" - ".join(projects_list[i]) + "\n"
f = codecs.open(outputFileName, "w", "utf-8")
f.writelines(projects_list)
f.close()
Я пользуюсь Notepad++ и в нем файл отображается нормально. Но, как оказалось, если открывать файл в блокноте, то переход на новую строку исчезает и весь список пишется в файл одной строкой. Подскажите пожалуйста хотя бы в какую сторону копать, ибо проблема возникает только с этим файлом, со всеми остальными все в порядке.
XPb14
Нагуглил следующее -
for i in range(len(projects_list)):
	projects_list[i] = u" - ".join(projects_list[i]) + "\r\n" #Добавил переход каретки
f = codecs.open(outputFileName, "w", "utf-8")
f.writelines(projects_list)
f.close()
Теперь и в блокноте все нормально. Был бы благодарен, если бы кто-то пояснил ситуацию, ибо хочется понять почему в этом случае не работал “\n”.
oldbay
XPb14
#Добавил переход каретки

Теперь и в блокноте все нормально. Был бы благодарен, если бы кто-то пояснил ситуацию, ибо хочется понять почему в этом случае не работал “\n”.

потому что именно так работает перевод строки в windows
в nix* перехода каретки не требуется
XPb14
Спасибо за ссылку, изучаю. Вот только дело в том, что прямо в этом же модуле есть другая функция, которая практически эдентична здесь написанной, различие только в том, что “\n” стоит вначале каждой строки (я пробовал на этом примере сделать так, но безрезультатно). И там все нормально работает, да вобще везде все нормально работало, я первый раз с этим столкнулся и вот не могу понять в чем отличие этого кода.
beelze
>практически эдентична…да вобще везде все нормально работало
на разных платформах (Win, nix, Mac) - разные стандартные соглашение о том, как представляется переход на новую строку. И если Вы хотите определенности при записи в файл - делайте это вручную. Notepad++ умеет автоопределять новую строку; блокнот же следует Windows-соглашению. Никакого «волшебства».
XPb14
Чесно говоря по вышеприведенной ссылке я уже более менее разобрался в вопросе. Но только суть в том, что все скрипты я запускаю на одной и той же машине, у себя на работе. И никогда даже не задумывался, что “\n” может не сработать. Очень много скриптов, которые ведут разного вида логи, т.е. запись в файл - одна из повседневных задач, а тут раз и не переводит строку. И, получается, что до этого у меня везде была ошибка. Так почему же раньше (сейчас все скрипты по прежнему работают и переводят на новую строку каретку по эскейпу “\n”, как и раньше) все нормально было, а именно тут сломалось. Вот что меня терзает. Суть проблемы — во всех скриптах, включая файл с этой функцией хватает простого “\n”, но в новой функции надо уже “\r\n”, хотя старые по прежнему работают.
beelze
здесь неуместно применять термин «ошибка». Есть несоответствиестандарту платформы, которое может и не быть заметным - в зависимости от того, «чем» Вы смотрите
вот например из описания open():
The most commonly-used values of mode are ‘r’ for reading, ‘w’ for writing (truncating the file if it already exists), and ‘a’ for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to ‘r’. The default is to use text mode, which may convert ‘\n’ characters to a platform-specific representation on writing and back on reading. Thus, when opening a binary file, you should append ‘b’ to the mode value to open the file in binary mode, which will improve portability. (Appending ‘b’ is useful even on systems that don’t treat binary and text files differently, where it serves as documentation.) See below for more possible values of mode.

In addition to the standard fopen() values mode may be ‘U’ or ‘rU’. Python is usually built with universal newline support; supplying ‘U’ opens the file as a text file, but lines may be terminated by any of the following: the Unix end-of-line convention ‘\n’, the Macintosh convention ‘\r’, or the Windows convention ‘\r\n’. All of these external representations are seen as ‘\n’ by the Python program. If Python is built without universal newline support a mode with ‘U’ is the same as normal text mode. Note that file objects so opened also have an attribute called newlines which has a value of None (if no newlines have yet been seen), ‘\n’, ‘\r’, ‘\r\n’, or a tuple containing all the newline types seen.


то есть Вам просто нужно четко понимать, что Вы получите при, например, записи в файл каким-то из способов - либо автоматическую конверсию под текущую платформу, либо побайтовое соответствие тому, что Вы пишете. При записи в файл, открытый open(file, ‘wb’), Вы получите конкретно то, что пишете; при open(file, ‘w’) - автопреобразование.


XPb14
Огромное спасибо, наконец-то все стало на свои места. Теперь моя душа спокойна, я умиротворен, пойду поем. :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB