Найти - Пользователи
Полная версия: Подсчет словосочетаний в файлах
Начало » Python для новичков » Подсчет словосочетаний в файлах
1 2 3 4 5 6 7
py.user.next
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')
>>>
Kir@
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’

А не видит он этот файл потому что он в директории ниже валяется. Т.е. надо путь к указанным файлам найти, а потом их скопировать…
py.user.next
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) запрещает.
Kir@
py.user.next
Ты функцию напиши, которая принимает путь поиска, а возвращает цепочку путей нужных файлов.
Ыыы, ни одного знакомого слова
Попробую угадать: os.path.abspath(path)?
py.user.next
Kir@
Попробую угадать: os.path.abspath(path)?
Не, просто в функцию запихиваешь вот этот вот поиск через os.walk(). А в другую - копирование через shutil.copy() .
Kir@
py.user.next
Не, просто в функцию запихиваешь вот этот вот поиск через os.walk(). А в другую - копирование через shutil.copy() .
У меня ерунда получается + внутри функции программа не видит переменные, объявленные выше.
py.user.next
Запости весь код и версию питона.
Kir@
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
py.user.next
#!/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()

Всё проверил.
Не стал делать проверку на совпадающие имена найденных файлов. Там надо проверять, не совпадает ли имя найденного файла с каким-нибудь из найденных ранее. Если совпадает, надо его переименовать.
Shaman
У меня такое крутится:
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB