Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2015 20:55:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Подсчет словосочетаний в файлах

Неожиданно активная дискуссия.

Сам давным давно пользуюсь вот такими итераторами. По функциональности имитируют юниксовый find. Пока хватало, но может и надо чего подправить…

def PathFind(pattr, root="."):
    u"""аналог find из bash"""
    for di, dl, fl in os.walk(root):
        for f in glob.fnmatch.filter(fl, pattr):
            yield os.path.join(di, f)
def PathFindDir(pattr, root="."):
    u"""аналог find из bash"""
    for di, dl, fl in os.walk(root):
        for f in glob.fnmatch.filter(dl, pattr):
            yield os.path.join(di, f)

К вопросу о чтении doc. Да так как вы делаете можно сделать. Причем код будет один в один. НО именно COM интерфейс самая тормозная штука. Если вы текст будете по абзацам собирать, то может оказаться долго. Поэтому лучше сразу все скинуть в текстовый файл и потом с ним разбираться. Думаю будет быстрее чем так как у вас сделано. Вытаскивать текст из xml еще быстрее, но старые файлы не прочитаешь.

Думаю будет как-то так:
import win32com.client
word = win32com.client.gencache.EnsureDispatch("Word.Application")
word.Visible = 0
time.sleep(1)
word.Documents.Open(os.path.abspath(out_file))
doc = word.Documents(word.ActiveDocument())
with open(os.path.abspath(out_file)+".txt","w",encoding="utf-8") as f:
    f.write(doc.Content.Text)
:( Непосредственно файлы читать в сотни раз быстрее.



Отредактировано doza_and (Авг. 20, 2015 21:04:26)

Офлайн

#2 Авг. 21, 2015 00:19:32

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

Подсчет словосочетаний в файлах

doza_and
Пока хватало, но может и надо чего подправить…
Во-первых, внутри модуля glob не документировано, что там есть доступ к fnmatch - значит, то, что он основан на fnmatch и основан именно таким образом, вилами на воде писано. Хочешь юзать fnmatch - импортируй модуль fnmatch.
И я тебе говорил уже триста лет назад то же самое. ;)

doza_and
По функциональности имитируют юниксовый find.
Одна рекурсия - маловато для имитации. Вообще-то, там есть поиск и по регуляркам, где можно искать и doc, и docx (уж не говоря про odt, который может вдруг понадобиться), и другие одновременно (за один проход).

doza_and
def PathFind(pattr, root="."):
Вот-вот, нужно найти и doc, и docx, а так оно не найдёт, и нужно делать два вызова (два прохода). Это во-вторых.

Shaman
я пишу код с генератором и проблем не имею
Но мы-то видим, что это быдлокод ;)
В чём быдлокодистость: человек берёт и делает генератор, который не делает ничего. Тратит ресурсы на этот генератор, чтобы сэкономить одну строчку.
А ты в курсе, что его ещё нужно сидеть и перечитывать по пятьсот раз, чтобы убедиться, что ты его без ошибок написал?
Код пишется один раз, а читается - тысячу (разными людьми, которые не знают, что ты там думал).



Отредактировано py.user.next (Авг. 21, 2015 00:36:12)

Офлайн

#3 Авг. 21, 2015 00:36:01

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет словосочетаний в файлах

py.user.next
Но мы-то видим, что это быдлокод
В чём быдлокодистость: человек берёт и делает генератор, который не делает ничего. Тратит ресурсы на этот генератор, чтобы сэкономить одну строчку.
А ты в курсе, что его ещё нужно сидеть и перечитывать по пятьсот раз, чтобы убедиться, что ты его без ошибок написал?
Код пишется один раз, а читается - тысячу.
Вы, наверное, мало работали с чужим кодом. Прокачивайте свой скилл.
Вообще, опечалила невозможность задавать условие отбора в объявлении цикла, тогда как в генераторах оно есть. А ведь можно было бы писать красиво for … in … if ….. : ……
з.ы.
в свою очередь вижу задротство в учете ресурсов там где их море.

Офлайн

#4 Авг. 21, 2015 00:41:49

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

Подсчет словосочетаний в файлах

Shaman
Вы, наверное, мало работали с чужим кодом. Прокачивайте свой скилл.
Это ты про себя пишешь. Если бы ты работал, то имел бы дело с понятным кодом и писал бы так же. А так ты для себя написал, как быдлокодер однострочник, у которого никто код не юзает.

Shaman
в свою очередь вижу задротство в учете ресурсов там где их море
Это случай не тот, у тебя генератор не представляет из себя ничего (конструкция типа (f for f in seq) ), а его применение ты аргументируешь лишней строчкой (кстати, вполне читаемой, и более читаемой).



Отредактировано py.user.next (Авг. 21, 2015 00:45:38)

Офлайн

#5 Авг. 21, 2015 00:49:24

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет словосочетаний в файлах

py.user.next
Это ты про себя пишешь. Если бы ты работал, то имел бы дело с понятным кодом и писал бы так же.
Я имел дело с разным. Как я должен писать поле такого?
py.user.next
А так ты для себя написал, как быдлокодер однострочник, у которого никто код не юзает.
Совершенно верно, это был код “для себя”. Не нравится - никто не заставляет.
py.user.next
Это случай не тот, у тебя генератор не представляет из себя ничего
Это костыльная замена несуществующей конструкции о которой я написал выше. И если из-за неё начнёт использоваться на несколько миллипроцентов больше памяти со временем, я это смогу пережить.

Офлайн

#6 Авг. 21, 2015 00:51:22

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет словосочетаний в файлах

py.user.next
Кстати, твой код, приведённый выше, может не увидеть некоторые файлы - вот где проблема.

Офлайн

#7 Авг. 21, 2015 00:57:18

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

Подсчет словосочетаний в файлах

Shaman
Кстати, твой код, приведённый выше, может не увидеть некоторые файлы - вот где проблема.
Вот этот? Интересно, какие он может не увидеть, если он просматривает все.

Shaman
И если из-за неё начнёт использоваться на несколько миллипроцентов больше памяти со временем, я это смогу пережить.
Проблема в том, что он не делает ничего, а чтение усложняет. Да, и зачем ты там сделал _f ? Ты разве не знаешь, что внутренние имена в comprehensions остаются внутренними и там можно оставить f?



Отредактировано py.user.next (Авг. 21, 2015 01:01:48)

Офлайн

#8 Авг. 21, 2015 00:59:31

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет словосочетаний в файлах

py.user.next
Вот этот? Интересно, какие он может не увидеть, если он просматривает все.
Посмотри внимательно на мой код.

Офлайн

#9 Авг. 21, 2015 01:00:10

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет словосочетаний в файлах

py.user.next
Проблема в том, что он не делает ничего, а чтение усложняет.
Как же ничего, если он фильтрует?

Офлайн

#10 Авг. 21, 2015 01:02:40

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

Подсчет словосочетаний в файлах

Shaman
Посмотри внимательно на мой код.
А, ты имеешь ввиду lower()? А с чего вдруг я должен переносимый код подстраивать под винду? ;) Вот он под линем и съест у тебя не те файлы.



Отредактировано py.user.next (Авг. 21, 2015 01:07:20)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version