Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2013 23:42:44

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

py.user.next
он блоком называет набор строк, то есть это никакого отношения к блочному чтению не имеет
Капитан, это понятно :)

py.user.next
в задании - работа со строками => нужен текстовый режим
Чем хуже режим ‘rb’ ? текстовый режим меня уже один раз подвёл, забыл?



Офлайн

#2 Дек. 2, 2013 21:48:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

Budulianin
Чем хуже режим ‘rb’ ?
во-первых, в третьем питоне есть разница, что возвращается из файла, строки или байтовые объекты
так как строки - наборы юникодовых точек, то и символы там могут быть любые
следовательно, из файла он может прочитать что угодно, и искать в них можно тоже что угодно

во-вторых, в бинарном режиме рассматриваются лишние символы; например, возврат каретки будет рассматриваться как символ, хотя это не нужно, а иногда даже ошибку может вызвать (если start задать конкретно с переводом строки \n, то она не совпадёт из-за возврата каретки, я уж не говорю о том, что строку в байтовом объекте искать нельзя (для удобства допустил, что ты её перевёл в байтовый объект))

в-третьих, текстовый режим даёт кроссплатформенность, то есть это значит, что скрипт, применяемый в разных системах, проводит сравнения одинаково, и не нужно писать n разных кодов, которые учитывают различия
то есть, где-то может быть \r - ты пишешь код, который её учтёт, а где-то нет \r - получается, первый код делает лишнюю работу в таком случае, учитывая то, чего нет и не будет на данной системе

и ещё: не делай того, чего никто не делает - не преумножай сущности без необходимости
то есть, если тебе чего-то не надо, то и на всякий случай это делать не надо



Отредактировано py.user.next (Дек. 2, 2013 21:51:01)

Офлайн

#3 Дек. 2, 2013 22:51:21

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

py.user.next
во-первых, в третьем питоне есть разница, что возвращается из файла, строки или байтовые объекты
так как строки - наборы юникодовых точек, то и символы там могут быть любые
следовательно, из файла он может прочитать что угодно, и искать в них можно тоже что угодно

Да, Python 3.x возвращает bytes. Я Python 2.x пользуюсь, там str возвращает. Т.е. в Python 3 из-за юникода, символ #26 не прервёт чтение файла на винде, в текстовом режиме?

py.user.next
во-вторых, в бинарном режиме рассматриваются лишние символы; например, возврат каретки будет рассматриваться как символ, хотя это не нужно, а иногда даже ошибку может вызвать (если start задать конкретно с переводом строки \n, то она не совпадёт из-за возврата каретки, я уж не говорю о том, что строку в байтовом объекте искать нельзя (для удобства допустил, что ты её перевёл в байтовый объект))

Возврат каретки будет, если этот файл из винды, ну или из мака. Строку искать в байтах нельзя, просто у меня Python 2.x. и у меня там str.

py.user.next
в-третьих, текстовый режим даёт кроссплатформенность, то есть это значит, что скрипт, применяемый в разных системах, проводит сравнения одинаково, и не нужно писать n разных кодов, которые учитывают различия

Это я уже усвоил.

py.user.next
то есть, где-то может быть \r - ты пишешь код, который её учтёт, а где-то нет \r - получается, первый код делает лишнюю работу в таком случае, учитывая то, чего нет и не будет на данной системе
Обычно файл читаешь построчно и даже, если \r там появляется, то он никак не мешает( если будет \r\n то конец строки норм воспронимается, если только \r то текстовый режим тоже не поможет, всё сольётся в одну строку )

py.user.next
и ещё: не делай того, чего никто не делает - не преумножай сущности без необходимости
то есть, если тебе чего-то не надо, то и на всякий случай это делать не надо

Спасибо за совет, учту. А как же быть с виндой и 26 символом ? :) Это такая редкость, что не стоит так заморачиваться?



Офлайн

#4 Дек. 3, 2013 01:36:30

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

Budulianin
А как же быть с виндой и 26 символом ? :) Это такая редкость, что не стоит так заморачиваться?
думаю что да. Из за того что вам попался случай 1 из десяти миллионов, вы начали “паниковать”. Текстовый файл подразумевает наличие в нем только текста. Если где то, кто то нехороший, из самых тайных побуждений, решил в текстовые файлы вписывать еще абы какие символы, то это его проблема,но да которая окликнулась на вас. НИКТО не застрахован от такого, и это нужно рассматривать как редкостный случай, но никак не обыденность.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Дек. 3, 2013 23:30:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

Budulianin
Да, Python 3.x возвращает bytes. Я Python 2.x пользуюсь, там str возвращает.
Budulianin
Строку искать в байтах нельзя, просто у меня Python 2.x. и у меня там str.
во-во, я так и подумал :)
иначе зачем бы ты писал ему решение для второго

у автора третий питон, он написал это в названии темы

Budulianin
Т.е. в Python 3 из-за юникода, символ #26 не прервёт чтение файла на винде, в текстовом режиме?
если там что-то прервётся, это проблемы винды
если бы это было важно, то текстовый режим был бы запрещён на винде прямо в питоне

Budulianin
Обычно файл читаешь построчно и даже, если \r там появляется, то он никак не мешает( если будет \r\n то конец строки норм воспронимается, если только \r то текстовый режим тоже не поможет, всё сольётся в одну строку )

[guest@localhost py]$ echo -en "a\rb\rc" >file.txt
[guest@localhost py]$ .hex file.txt
00000000 61 0d 62 0d 63 |a.b.c|
00000005
[guest@localhost py]$

>>> f = open('file.txt', encoding='utf-8')
>>> next(f)
'a\n'
>>> next(f)
'b\n'
>>> next(f)
'c'
>>>

>>> f = open('file.txt', encoding='utf-8')
>>> s = next(f)
>>> s
'a\n'
>>> 'a\n' in s
True
>>> f = open('file.txt', 'rb')
>>> s = next(f)
>>> s
b'a\rb\rc'
>>> b'a\n' in s
False
>>>

Budulianin
А как же быть с виндой и 26 символом ? :) Это такая редкость, что не стоит так заморачиваться?
это реально не стоит внимания
изначально речь идёт про текстовый файл, и с какого перепугу в нём появится такой виндовый символ ? (очередная затычка от индусов)
если даже там есть такое, то файл нужно сначала подготовить, а не закладывать эту туфту в нормальный скрипт

какой-то “индус” пропёрся (индус - это образно, это и америкос мог быть), а ты из-за этого свои программы коверкаешь - это не дело



Офлайн

#6 Дек. 4, 2013 14:42:52

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

py.user.next
Обычно файл читаешь построчно и даже, если \r там появляется, то он никак не мешает( если будет \r\n то конец строки норм воспронимается, если только \r то текстовый режим тоже не поможет, всё сольётся в одну строку )
py.user.next
$ echo -en “a\rb\rc” >file.txt

Это ты Python3.x пользуешься, а Python 2.x нетакой догадливый.


~$ echo -en 'a\rb\rc' > file.txt
fin = open('file.txt')
next(fin)
'a\rb\rc'

py.user.next
если даже там есть такое, то файл нужно сначала подготовить, а не закладывать эту туфту в нормальный скрипт

Обработать его предварительно, удалив эти символы? Но это нужно обрабатывать файл повторно, с большими файлами затратно, легче уж в бинарном режиме, если такая ситуация.


py.user.next
какой-то “индус” пропёрся (индус - это образно, это и америкос мог быть), а ты из-за этого свои программы коверкаешь - это не дело

Ну да, я преувеличил проблему, из-за этого случая. Буду бинарный режим, только по назначению использовать.

Cтал замечать, что в Python2.x больше косяков, чем в Python3.x. Наверно надо Python 3.x по возможности пользоваться, а Python2.x только при необходимости. Но недавно писал парсер логов, который запускался в несколько процессов параллельно. Запускал его на Python3.x и на Python2.x, на Python2.x быстрее работал. Запускал на Windows и на Linux, на Linux быстрее работал :)



Офлайн

#7 Дек. 4, 2013 23:18:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

Budulianin
Это ты Python3.x пользуешься, а Python 2.x нетакой догадливый.
конечно, третий-то лучше сделан

ну, есть там распознавание, во втором
но сырое
>>> import codecs
>>> f = codecs.open('file.txt', encoding='utf-8')
>>> next(f)
u'a\r'
>>> next(f)
u'b\r'
>>> next(f)
u'c'
>>>

там, походу, придётся стрипать и сравнивать - то есть применять чисто для второго стиль

Budulianin
Обработать его предварительно, удалив эти символы?
да

Budulianin
Но это нужно обрабатывать файл повторно, с большими файлами затратно, легче уж в бинарном режиме, если такая ситуация.
если будешь бинарно обрабатывать текстовые файлы, станешь индусом
а это очень вредно - заполнить голову всякой ерундой; а потом строить стены, а к ним лесенки

закладываешь косяки, они накапливаются, а потом ещё на них строишь что-нибудь, и всё - косяки не исправить

Budulianin
Cтал замечать, что в Python2.x больше косяков, чем в Python3.x.
там дофига таких косяков
почему ? потому что сначала пишут и пробуют расклады разные, а потом становится ясно, какие прижились, а какие лучше удалить вообще



Офлайн

#8 Дек. 4, 2013 23:41:52

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

py.user.next
если будешь бинарно обрабатывать текстовые файлы, станешь индусом
а это очень вредно - заполнить голову всякой ерундой; а потом строить стены, а к ним лесенки

Согласен, но когда можно реализовать решение, без повторной обработки файла, через бинарный режим, лучше уж так сделать, если данные в таком виде перемешенном. А в остальных случаях, как обычно в текстовом.

Файлы были в zip архивах, которые в среднем, весят 1.6 GB

py.user.next
там дофига таких косяков
почему ? потому что сначала пишут и пробуют расклады разные, а потом становится ясно, какие прижились, а какие лучше удалить вообще

Это высказывание, точно так же применительно и к Python 3.x, он же тоже развивается



Отредактировано Budulianin (Дек. 4, 2013 23:53:22)

Офлайн

#9 Дек. 5, 2013 21:00:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

Budulianin
Согласен, но когда можно реализовать решение, без повторной обработки файла, через бинарный режим, лучше уж так сделать, если данные в таком виде перемешенном.
если данные перемешаны, то это не текстовый файл

Budulianin
Это высказывание, точно так же применительно и к Python 3.x, он же тоже развивается
ну, применимо, а кто обратное говорил ?
только разница есть: в первом и втором питоне всё сырое, поэтому там много кардинальных изменений, а в третьем и последующих уже всё почищено

я бы, конечно, убрал бы строковые методы куда-то, большинство из них не используются, а изучать их нужно, например str.isnumeric() или вообще str.isidentifier() - этот вообще специфический, так что непонятно, что он делает в ядре языка



Отредактировано py.user.next (Дек. 5, 2013 21:01:28)

Офлайн

#10 Дек. 5, 2013 23:13:24

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

python 3 читаем файл и записываем блоками

py.user.next
только разница есть: в первом и втором питоне всё сырое, поэтому там много кардинальных изменений, а в третьем и последующих уже всё почищено

Может так?: в Python 2.x много кардинальных изменений, из-за этого там много сырости

Почему так? Потому что в Python 2.x накопилось много разных экспериментов, а в Python 3.x из этого множества решили взять только субъективно-лучшее ? Может линии развития Python 3.x более строгие, по сравнению с Python 2.x ?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version