Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 2

Ограничение во вложенности поддиректорий

28.01.2017, 18:07. Показов 3578. Ответов 15

Студворк — интернет-сервис помощи студентам
Граждане, айнидхелп, проблема такая:
на 3-ем Питоне пишу программу, которая исследует директории со всеми вложенными подпапками по рекурсивному принципу:

Python
1
2
3
4
5
6
7
8
9
10
def findUDirURL(dir, url_hash):
print(os.getcwd())
print(dir)
for name in os.listdir(dir):
subpath = os.path.join(dir, name)
if not os.path.isdir(subpath):
if name.endswith("[dynurl]") or name.endswith("[url]"):
writeURLList(os.path.join(subpath, "sub_url"), url_hash)
else:
findUDirURL(subpath, url_hash)
Во многих случая обрабатывается нормально, но когда вложенность достигает определённого уровня, срабатывает исключение и возвращается "no such file or directory..".
Отсюда вопрос: каким образом либо расширить этот диапазон вложенности, либо применить иные механизмы для его сокращения, напр. воспользоваться относительным путём вместо абсолютного.
Пока у самого меня ничего не вышло.
Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2017, 18:07
Ответы с готовыми решениями:

Массив: Превратить заданный массив с несколькими уровнями вложенности в массив с одним уровнем вложенности.
Добрый день. Необходимо выполнить задание: Дано массив: , ], ]. Написать программу, которая превратит заданный массив с...

Ограничение на уровень вложенности
Доброго времени суток. Столкнулся с проблемой при автоматической генерации отчёта в формате Excel средствами EPPlus. При сложной...

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

15
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
28.01.2017, 22:04
Лучший ответ Сообщение было отмечено Stekachev как решение

Решение

Попробуйте вызвать функцию с именем в UNC-формате
Python
1
2
dir = '\\\\?\\' + os.path.realpath(dir)
findUDirURL(dir, url_hash)
1
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
29.01.2017, 10:14
может быть через os.walk()?
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
29.01.2017, 11:05
Wi0M, реализация os.walk то же использует os.listdir и рекурсию, так что вряд ли прокатит
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
30.01.2017, 04:13
Не знаю как в *nix системах, а в windows сообщение "no such file or directory.." появляется при очень длинном имени файла (больше 256 символов в win32 и 512 в win64).
Решения, кроме разбора результата выполнения
Bash
1
dir path_for_search /B /S
не нашел.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2017, 12:45
Возможен вот такой вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os
 
def recurse_dir(dir_name):
    for name in os.listdir(dir_name):
        subpath = os.path.join(dir_name, name)
        if not os.path.isdir(subpath):
            print(subpath)
        else:
            print(subpath)
            os.chdir(subpath)
            recurse_dir(subpath)
        
        
recurse_dir('d:/dir')


Правда, порядок обхода оставляет желать лучшего - но это то, что пришло в голову на этот момент.
Еще, как вариант, можно попробовать использовать непосредственно WinAPI для листинга директорий\файлов с тем же синтаксисом '\\\\?\\', который указал shsv. Для встроенных python функций он почему-то не работает (должен на windows отключать проверку корректности\допустимости пути), а вот с winAPI функциями по идее должен.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2017, 12:52
----------------
PS: Впрочем, нет - предложенный вариант похоже ничем не отличается от того, что у ТС.
Так что остается попробовать WinAPI.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
30.01.2017, 13:29
Цитата Сообщение от Garry Galler Посмотреть сообщение
Для встроенных python функций он почему-то не работает
А у мну работает, по крайней мере в данном конкретном случае с функцией TC.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2017, 13:40
shsv,
А так:
Python
1
2
s='D:/dir/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/11111111111111111111111111111111111111111.txt'
open('\\\\?\\' + s,'w').write('test')
У меня создавать файлы с превышением лимита NTFS посредством UNC путей не получалось (а была как-то такая необходимость).
1
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
30.01.2017, 13:57
Да, действительно, не работает. Жаль...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2017, 14:06
shsv,
А действительно - если обернуть весь путь в os.path.realpath - то создание файла работает.
Не знал. Спасибо за наводку :-)

Добавлено через 7 минут
Хотя вот более точный результат: 248 на полный путь каталога со слэшем в конце и 255 - на имя файла с расширением. Далее все-таки не позволяет.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
30.01.2017, 14:35
Лучший ответ Сообщение было отмечено Stekachev как решение

Решение

Хм, вот это работает
Python
1
2
3
4
5
6
import os
 
s = r'c:\temp\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\ddddddddddddddddddddddddddddddddddd\ffffffffffffffffffffffffffffff\wwwwwwwwwwwwwwwwwwwwwwwww\yyyyyyyyyyyyyy\tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt\rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' 
 
os.makedirs('\\\\?\\' + s)
open('\\\\?\\' + os.path.realpath(s) + r'\11111111111111111111111111111111111111111.txt','w').write('test')
2
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2017, 16:51
Цитата Сообщение от Garry Galler Посмотреть сообщение
для листинга директорий\файлов с тем же синтаксисом '\\\\?\\', который указал shsv. Для встроенных python функций он почему-то не работает (должен на windows отключать проверку корректности\допустимости пути),
python функций должны скрывать внутри эту возможность, ибо по разные системы эта штука работает по разному.
У меня подозрения что проблема в другом.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2017, 18:07
Цитата Сообщение от shsv Посмотреть сообщение
Хм, вот это работает
Да, все работает - ваш тест точнее моего. Я работал с вложенными директориями, созданными вручную - а в этом случае проводник не дал мне создать вложенный путь общей длиной более 248 символов. Пробовал создать систему вложенных папок циклом через os.mkdir, однако почему-то не вышло, а os.makedirs-ом не додумался.
Так что теория, описанная в доках microsoft, получается все-таки работает и для python функций: при использовании UNC нотации мы можем работать с путями общей длиной до 32767 символов (юникодных). НО при этом каждый компонент пути не должен превышать 255 символов. Так что обойти ограничение на длину имени файла в 255 символов все-таки нельзя, c чем я как-то безуспешно пытался бороться, неправильно истолковав возможности UNC :-)
0
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 2
30.01.2017, 18:19  [ТС]
Большое спасибо! Всё получилось в UNC!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2017, 22:16
Лучший ответ Сообщение было отмечено Stekachev как решение

Решение

https://habrahabr.ru/post/307186/
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.01.2017, 22:16
Помогаю со студенческими работами здесь

Массив поддиректорий
Добрый вечер, Решил написать небольшой скриптик и в нем необходимо получать массив имен папок для указанной директории. Вроде бы все...

Вывести отсортированный перечень поддиректорий
Здравствуйте, кто может помочь буду очень благодарна:gconfusion: Вывести на экран отсортированный по убыванию (по количеству...

Получение файлов из директории и поддиректорий
Здравствуйте! Есть метод для получения всех файлов из директории и всех его поддиректорий, изменял метод уже написанный: public...

Использование FileSystemWatcher для поддиректорий
Хочу отслеживать изменения в фс (копирование, удаление, создание файлов, переименование). Есть же программы для Windows подобного рода, вот...

Как получить имя поддиректорий
Дамы и Господа! Как обычно, очень нужна Ваша помощь. Задача у меня следующая: нужно скопировать все файлы и папки по указанному...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru