XPb14
Апрель 28, 2012 09:56:24
Имеется следующий код
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
Апрель 28, 2012 10:09:16
Нагуглил следующее -
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
Апрель 28, 2012 11:04:28
XPb14
#Добавил переход каретки
Теперь и в блокноте все нормально. Был бы благодарен, если бы кто-то пояснил ситуацию, ибо хочется понять почему в этом случае не работал “\n”.
потому что именно так работает
перевод строки в windows
в nix* перехода каретки не требуется
XPb14
Апрель 28, 2012 11:17:20
Спасибо за ссылку, изучаю. Вот только дело в том, что прямо в этом же модуле есть другая функция, которая практически эдентична здесь написанной, различие только в том, что “\n” стоит вначале каждой строки (я пробовал на этом примере сделать так, но безрезультатно). И там все нормально работает, да вобще везде все нормально работало, я первый раз с этим столкнулся и вот не могу понять в чем отличие этого кода.
beelze
Апрель 28, 2012 11:51:20
>практически эдентична…да вобще везде все нормально работало
на разных платформах (Win, nix, Mac) - разные стандартные соглашение о том, как представляется переход на новую строку. И если Вы хотите определенности при записи в файл - делайте это вручную. Notepad++ умеет автоопределять новую строку; блокнот же следует Windows-соглашению. Никакого «волшебства».
XPb14
Апрель 28, 2012 12:09:07
Чесно говоря по вышеприведенной ссылке я уже более менее разобрался в вопросе. Но только суть в том, что все скрипты я запускаю на одной и той же машине, у себя на работе. И никогда даже не задумывался, что “\n” может не сработать. Очень много скриптов, которые ведут разного вида логи, т.е. запись в файл - одна из повседневных задач, а тут раз и не переводит строку. И, получается, что до этого у меня везде была ошибка. Так почему же раньше (сейчас все скрипты по прежнему работают и переводят на новую строку каретку по эскейпу “\n”, как и раньше) все нормально было, а именно тут сломалось. Вот что меня терзает. Суть проблемы — во всех скриптах, включая файл с этой функцией хватает простого “\n”, но в новой функции надо уже “\r\n”, хотя старые по прежнему работают.
beelze
Апрель 28, 2012 12:37:21
здесь неуместно применять термин «ошибка». Есть несоответствиестандарту платформы, которое может и не быть заметным - в зависимости от того, «чем» Вы смотрите
вот например из описания 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
Апрель 28, 2012 12:40:34
Огромное спасибо, наконец-то все стало на свои места. Теперь моя душа спокойна, я умиротворен, пойду поем. :)