Имя: Пароль:
IT
Админ
Поиск каталога на Python
,
0 Злобная Печенька
 
25.05.14
16:00
Всем привет) Пишу парсилку файлов на питоне. Сама парсилка почти готова, но возникла проблема. Хочу настроить, чтобы скрипт смотрел только в определенных директориях. Попробовала разные варианты, пока ничего не получается(( Может вы подскажете:

[code]

import re

path = re.match(r'(\d+)05(+\d)','C:\Users\\Documents\SC\LOG')

[/code]

такой код выводит ошибку
  File "C:\Python27\lib\re.py", line 137, in match
    return _compile(pattern, flags).match(string)
  File "C:\Python27\lib\re.py", line 242, in _compile
    raise error, v # invalid expression
error: nothing to repeat

Хотя в папке LOG присутствует несколько подходящих директорий
1 Злобная Печенька
 
25.05.14
16:16
Заметила косяк, поменяла на  re.match(r'(\d+)05(\d+)', теперь выдает другую ошибку...
2 Злобная Печенька
 
25.05.14
16:18
+ (1) TypeError: coercing to Unicode: need string or buffer, NoneType found
3 Злобная Печенька
 
25.05.14
16:32
path = r'C:\Users\\Documents\SC\LOG\(\d+)05(\d+)', так вроде работает, но не выдает ничего. Блин, ничего не понимаю(
4 Web00001
 
25.05.14
16:35
когда писал http://www.1c-cod.ru/ сильно помогла тестилка регулярных выражений (написанная на питоне) http://re-try.appspot.com/ ну и книжка Дж.Фридл - Регулярные выражения. Тоже в тему
5 Злобная Печенька
 
25.05.14
16:36
(4) Спасибо, иду смотреть))
6 Ammophilla
 
25.05.14
16:48
))
import os
path_to_dir = ‘.’ #здесь путь к твоей директории
os.listdir(path_to_dir)  - это все файлы, которые есть в данной директории.
Ты ведь знаешь, какая директория тебе нужна…
7 Злобная Печенька
 
25.05.14
16:50
(6) В том то и дело, что путь не однозначен. НАпример в папке LOG могут быть папки 010314, 020414, 050514. Поиск в одном каталоге у меня и так работает)) Надо, чтобы в каталоги по маске смотрел
8 kokamoonga
 
25.05.14
17:35
(0) вариант в (0) и не будет работать, ты же ему строку для сравнения задаешь 'C:\Users\\Documents\SC\LOG'

(3) этот вариант непонятно как должен работать. 05 укладывается в паттерн \d+  


Не проще сделать это через os.listdir() с поиском в списке по маске?
9 kokamoonga
 
25.05.14
17:39
(3) + кроме того здесь сознательно двойной слэш после Users?
10 Злобная Печенька
 
25.05.14
17:45
(9) нет, убрана фамилия)))
11 Злобная Печенька
 
25.05.14
17:46
(8) мне надо, чтобы он искал папки, в которых есть совпадение 05. os.listdir() попробую, спасибо
12 kokamoonga
 
25.05.14
17:48
(11) ну так os.listdir('C:\Users\\Documents\SC\LOG') ты получаешь список всех имен в директории

если там могут быть и файлы дополнительно можно проверять os.path.isdir()
13 Злобная Печенька
 
26.05.14
14:19
Вернусь к своим баранам, ой парсилкам) прошу сильно не бить))

в итоге получаю код

mfile = re.compile(r'\b[A-Z0-9._%+-]+05+\b[A-Z0-9.-]')
dirs = 'C:\Users\111\Documents\SC\LOG\\'+ mfile.findall() +'\\'
print dirs

Выходит ошибка
TypeError: Required argument 'source' (pos 1) not found

Если пишу так
mfile = '\b[A-Z0-9._%+-]+05+\b[A-Z0-9.-]'
dirs = 'C:\Users\Gshelganova\Documents\SC\LOG_tgk\\'+ mfile +'\\'
print dirs

все работает, но маску он понимает буквально. И это пейчаль(( os.lisdir пробовала, не помогает.
14 Web00001
 
26.05.14
16:00
>>TypeError: Required argument 'source' (pos 1) not found
Так это, того, findall ожидает паттерн для поиска в аргументах
https://docs.python.org/2/library/re.html#re.RegexObject.findall
15 Злобная Печенька
 
26.05.14
16:17
Нашла решение-
dirs = glob.glob('C:\Users\\Documents\SC\LOG\\*05*\\')
Получаю список, и уже по списку циклом пробегаю)) Всем спасибо за помощь!
16 kokamoonga
 
26.05.14
19:47
(13) >>> os.lisdir пробовала, не помогает.

так чисто для интереса, а как именно не помогает? не перечисляет имена в каталоге? или есть сложности с обходом списка имен в цикле?

Вот такой код не работает?

import re
import os

root = 'C:\Users\Gshelganova\Documents\SC\LOG_tgk\'
names = os.listdir(root)

dirs = [x for x in names if os.path.isdir(os.path.join(root, x)) and re.match(r'.*05.*', x)]
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший