Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2020 12:59:14

@Gleb@
Зарегистрирован: 2020-05-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

Здравствуете, подскажите есть ли у функции os.walk() какие либо ограничения по количеству воспринимаемых каталогов и файлов? И можно ли его обойти?
Спрашиваю, потому что делаю программу, которая может создавать копию каталога, а также всех каталогов входящих в копируемый каталог, а также файлов Word и Excel.
Код такой:

 import os, shutil
q, File_name = os.path.split(os.getcwd())
os.mkdir(q + "\\" + "конечный путь")
for folder_name, subfolders, filenames in os.walk(os.getcwd()) :
    for subfolders_1 in subfolders :
        subfolders_1 = folder_name + "\\" + subfolders_1
        subfolders_1 = subfolders_1.replace(File_name, "конечный путь")
        os.mkdir(subfolders_1)
    for filenames_1 in filenames :
        if filenames_1.endswith(".doc") or filenames_1.endswith(".docx") or filenames_1.endswith(".xlsx")\
                or filenames_1.endswith(".xls"):
            filenames_1 = folder_name + "\\" + filenames_1
            filenames_2 = filenames_1.replace(File_name, "конечный путь")
            shutil.copy(filenames_1, filenames_2)

Если я его запускаю на небольших каталогах (небольших в том смысле, что там мало каталогов), то все работает хорошо.

Но, когда я запускаю на больших каталогах, то копируется не все, а только часть, как будто бы в функции os.walk() есть какой-то ограничение.


Заранее благодарю!

Отредактировано @Gleb@ (Май 4, 2020 10:39:14)

Офлайн

#2 Май 3, 2020 23:03:54

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

ограничения в функции os.walk()

Используй теги кода на форуме, иначе стираются пробелы.

@Gleb@
Но, когда я запускаю на больших каталогах, то копируется не все, а только часть, как будто бы в функции os.walk() есть какой-то ограничение.
Нет там ограничения. Чтобы в этом убедиться, выведи все полученные пути на экран и прочитай их.



Офлайн

#3 Май 4, 2020 05:25:32

@Gleb@
Зарегистрирован: 2020-05-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

Я так и сделал, еще до того как написал сюда и получил аналогичный результат.
Но, как я понял код перестает работать, когда встречает имя файла длинной более 260 символов. Есть возможность как-то это обойти?

Офлайн

#4 Май 4, 2020 06:22:41

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

.



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#5 Май 4, 2020 06:43:03

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

ограничения в функции os.walk()

@Gleb@
когда встречает имя файла длинной более 260 символов. Есть возможность как-то это обойти?
Можешь попробовать включить в реестре Windows
https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN

То есть это не проблемы питона, а проблемы ограничений винды.



Офлайн

#6 Май 4, 2020 10:45:38

@Gleb@
Зарегистрирован: 2020-05-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

Нашел другое решение проблемы, более универсальное, надеюсь другим новичкам пригодится. Путь надо начинать с \\?\
То есть работающая программа будет выглядеть так :

 import os, shutil
q, File_name = os.path.split(os.getcwd())
os.mkdir(q + "\\" + "конечный путь")
for folder_name, subfolders, filenames in os.walk(os.getcwd()) :
    for subfolders_1 in subfolders :
        subfolders_1 = '\\\?\\' + folder_name + "\\" + subfolders_1 # Добавляем \\?\ здесь 
        subfolders_1 = subfolders_1.replace(File_name, "конечный путь")
        print(subfolders_1)
        os.mkdir(subfolders_1)
    for filenames_1 in filenames :
        if filenames_1.endswith(".doc") or filenames_1.endswith(".docx") or filenames_1.endswith(".xlsx")\
                or filenames_1.endswith(".xls"):
            filenames_1 = '\\\?\\' + folder_name + "\\" + filenames_1 # Добавляем \\?\ здесь 
            filenames_2 = filenames_1.replace(File_name, "конечный путь")
            shutil.copy(filenames_1, filenames_2)
            print(filenames_1)

Всем спасибо за помощь и ответы!

Офлайн

#7 Май 4, 2020 15:24:34

Panaet
Зарегистрирован: 2020-05-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

Всем привет я тут в первые не мгли бы вы мне помоч так как я начинаю толко не могу понять что в этом коде не так
from math import*
x = input('Диаметр арматуры?''\n')

if x == 16 == 18 == 20 == 22 == 25:
z = float(input('Какая длинa?' ‘\n’))
c = fkoat(input('Какая цена за метр?' ‘\n’))
print(z*c)

elif x == 28 == 30 == 32 == 36:
q = int(input('Какая длинa?' ‘\n’))
w = int(input('Сколько прутков?' ‘\n’))
он не выводит строки которые в иф и элиф без разницы ккие я ввел данные в х

Офлайн

#8 Май 4, 2020 19:33:21

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

> x == 16 == 18 == 20 == 22 == 25

  x in (16, 18, 20, 22, 25)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Май 4, 2020 20:57:49

Panaet
Зарегистрирован: 2020-05-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

Rodegast
Всепавно не выводит то что в иф и элиф

Офлайн

#10 Май 5, 2020 19:09:24

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

ограничения в функции os.walk()

Panaet
Всепавно не выводит то что в иф и элиф
пердположу что это просходит от того что вы не делаете преобразование типов после x = input('Диаметр арматуры?''\n') и в результате сравниваете тёплое с мягким (str c int)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version