Форум сайта python.su
0
Имеется следующий код
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()
Офлайн
0
Нагуглил следующее -
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()
Отредактировано XPb14 (Апрель 28, 2012 10:26:59)
Офлайн
1
XPb14
#Добавил переход каретки
Теперь и в блокноте все нормально. Был бы благодарен, если бы кто-то пояснил ситуацию, ибо хочется понять почему в этом случае не работал “\n”.
Офлайн
0
Спасибо за ссылку, изучаю. Вот только дело в том, что прямо в этом же модуле есть другая функция, которая практически эдентична здесь написанной, различие только в том, что “\n” стоит вначале каждой строки (я пробовал на этом примере сделать так, но безрезультатно). И там все нормально работает, да вобще везде все нормально работало, я первый раз с этим столкнулся и вот не могу понять в чем отличие этого кода.
Отредактировано XPb14 (Апрель 28, 2012 11:17:59)
Офлайн
3
>практически эдентична…да вобще везде все нормально работало
на разных платформах (Win, nix, Mac) - разные стандартные соглашение о том, как представляется переход на новую строку. И если Вы хотите определенности при записи в файл - делайте это вручную. Notepad++ умеет автоопределять новую строку; блокнот же следует Windows-соглашению. Никакого «волшебства».
Офлайн
0
Чесно говоря по вышеприведенной ссылке я уже более менее разобрался в вопросе. Но только суть в том, что все скрипты я запускаю на одной и той же машине, у себя на работе. И никогда даже не задумывался, что “\n” может не сработать. Очень много скриптов, которые ведут разного вида логи, т.е. запись в файл - одна из повседневных задач, а тут раз и не переводит строку. И, получается, что до этого у меня везде была ошибка. Так почему же раньше (сейчас все скрипты по прежнему работают и переводят на новую строку каретку по эскейпу “\n”, как и раньше) все нормально было, а именно тут сломалось. Вот что меня терзает. Суть проблемы — во всех скриптах, включая файл с этой функцией хватает простого “\n”, но в новой функции надо уже “\r\n”, хотя старые по прежнему работают.
Офлайн
3
здесь неуместно применять термин «ошибка». Есть несоответствиестандарту платформы, которое может и не быть заметным - в зависимости от того, «чем» Вы смотрите
вот например из описания 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’) - автопреобразование.
Отредактировано beelze (Апрель 28, 2012 12:41:18)
Офлайн
0
Огромное спасибо, наконец-то все стало на свои места. Теперь моя душа спокойна, я умиротворен, пойду поем. :)
Офлайн