Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2015 12:16:16

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

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

doza_and
Я бы в таком случае искал при помощи glob.
Не, glob не годится. Долго объяснять, но я не знаю даже, где glob удобен.
Как будешь искать на 11-ом уровне директории нужный файл? А если один файл на 5-ом уровне, а другой на 10-ом, и оба нужно найти? А если уровней 20? К тому же он найдёт и файл name.doc, и каталог name.doc, так как не различает типы.

Kir@
Директории называются русскими буквами вперемешку с пробелам
Это не имеет значения. Если у тебя второй питон, то используй юникод-строку для начального пути - os.walk() выдаст юникод-строки.
Если питон - третий, то вообще всё равно, на каком языке пути.

Kir@
Как теперь к этому коду прикрутить маску “*.doc?”?
>>> 'file.txt'.endswith(('.doc', '.docx'))
False
>>> 'file.doc'.endswith(('.doc', '.docx'))
True
>>> 'file.docx'.endswith(('.doc', '.docx'))
True
>>> 'file.doct'.endswith(('.doc', '.docx'))
False
>>>

>>> import re
>>> 
>>> re.search(r'\.docx?$', 'file.txt')
>>> re.search(r'\.docx?$', 'file.doc')
<_sre.SRE_Match object at 0xb74291e0>
>>> re.search(r'\.docx?$', 'file.docx')
<_sre.SRE_Match object at 0xb7429100>
>>> re.search(r'\.docx?$', 'file.doct')
>>>



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

Офлайн

#2 Авг. 20, 2015 12:24:10

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next, спасибо, я победил вот так:

for root, dirs, files in os.walk(czk):
    for name in files:
        if fnmatch.fnmatch(name, '*.doc?'):
            print(name)
Теперь это богатство буду копировать.
p.s. питон 3.

...
            print(name)
            shutil.copy(os.path.join(czk,name), "/1")
Ошибку выдает:
FileNotFoundError: No such file or directory: ‘//великий путь/название первого файла.docx’

А не видит он этот файл потому что он в директории ниже валяется. Т.е. надо путь к указанным файлам найти, а потом их скопировать…

Отредактировано Kir@ (Авг. 20, 2015 12:47:17)

Офлайн

#3 Авг. 20, 2015 12:50:06

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

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

Kir@
спасибо, я победил вот так
Так неправильно ;) Во-первых, он не найдёт .doc, а во-вторых, он найдёт .doct, .doca и прочие.

Ты функцию напиши, которая принимает путь поиска, а возвращает цепочку путей нужных файлов.

Определение:
def get_files_ext(source, exts)
Применение:
files = get_files_ext('/somedir', ('doc', 'docx'))

А дальше пишешь функцию, принимающую последовательность путей и путь к директории, в которую их надо скопировать.

Определение:
def copy_to_dir(lst, dest)
Применение:
copy_to_dir(files, '/anotherdir')

Можно и так потом сделать:
copy_to_dir(get_files_ext('/somedir', ('doc', 'docx')), '/anotherdir')
но не рекомендуется ;) ибо Дзен (import this) запрещает.



Отредактировано py.user.next (Авг. 20, 2015 13:04:54)

Офлайн

#4 Авг. 20, 2015 12:56:04

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next
Ты функцию напиши, которая принимает путь поиска, а возвращает цепочку путей нужных файлов.
Ыыы, ни одного знакомого слова
Попробую угадать: os.path.abspath(path)?

Офлайн

#5 Авг. 20, 2015 13:06:15

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

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

Kir@
Попробую угадать: os.path.abspath(path)?
Не, просто в функцию запихиваешь вот этот вот поиск через os.walk(). А в другую - копирование через shutil.copy() .



Офлайн

#6 Авг. 20, 2015 13:15:07

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next
Не, просто в функцию запихиваешь вот этот вот поиск через os.walk(). А в другую - копирование через shutil.copy() .
У меня ерунда получается + внутри функции программа не видит переменные, объявленные выше.

Офлайн

#7 Авг. 20, 2015 13:41:10

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

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

Запости весь код и версию питона.



Офлайн

#8 Авг. 20, 2015 13:47:32

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

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

import codecs #Модуль для чтения в разных кодировках
import os
import fnmatch
import shutil # Подключаем модуль для копирования файлов
czk='//путь/Протоколы 08_2015/'
pdzk='//путь/Протоколы 08 2015/'
print(czk)
print(pdzk)
print('======================')
#ЦЗК
for root, dirs, files in os.walk(czk):
    for name in files:
        if fnmatch.fnmatch(name, '*.docx'):
            print(name)
print('======================')
#ПДЗК
for root, dirs, files in os.walk(pdzk):
    for name in files:
        if fnmatch.fnmatch(name, '*.docx'):
            print(name)
print('======================')

Версия 3.5.0а1

Отредактировано Kir@ (Авг. 20, 2015 14:00:20)

Офлайн

#9 Авг. 20, 2015 14:08:08

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

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

#!/usr/bin/env python3
 
import os
import shutil
 
def get_files_ext(source, exts):
    exts = tuple('.' + i for i in exts)
    for root, dirs, files in os.walk(source):
        for name in files:
            if name.endswith(exts):
                yield os.path.join(root, name)
 
def copy_to_dir(seq, dest):
    for i in seq:
        shutil.copy(i, dest)
 
def main():
    input_dir = 'src'
    output_dir = 'dst'
    extensions = ('doc', 'docx')
    files = get_files_ext(input_dir, extensions)
    copy_to_dir(files, output_dir)
 
if __name__ == '__main__':
    main()

Всё проверил.
Не стал делать проверку на совпадающие имена найденных файлов. Там надо проверять, не совпадает ли имя найденного файла с каким-нибудь из найденных ранее. Если совпадает, надо его переименовать.



Отредактировано py.user.next (Авг. 20, 2015 14:19:03)

Офлайн

#10 Авг. 20, 2015 14:09:33

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

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

У меня такое крутится:

def walk_dtree(path):
    for dpath, _, fnames in os.walk(path):
        for f in (_f for _f in fnames if _f.lower().endswith(('.doc', '.docx'))):
            yield os.path.join(dpath, f)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version