Найти - Пользователи
Полная версия: ограничения в функции os.walk()
Начало » Python для новичков » ограничения в функции os.walk()
1
@Gleb@
Здравствуете, подскажите есть ли у функции 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() есть какой-то ограничение.


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

@Gleb@
Но, когда я запускаю на больших каталогах, то копируется не все, а только часть, как будто бы в функции os.walk() есть какой-то ограничение.
Нет там ограничения. Чтобы в этом убедиться, выведи все полученные пути на экран и прочитай их.
@Gleb@
Я так и сделал, еще до того как написал сюда и получил аналогичный результат.
Но, как я понял код перестает работать, когда встречает имя файла длинной более 260 символов. Есть возможность как-то это обойти?
AD0DE412
.
py.user.next
@Gleb@
когда встречает имя файла длинной более 260 символов. Есть возможность как-то это обойти?
Можешь попробовать включить в реестре Windows
https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN

То есть это не проблемы питона, а проблемы ограничений винды.
@Gleb@
Нашел другое решение проблемы, более универсальное, надеюсь другим новичкам пригодится. Путь надо начинать с \\?\
То есть работающая программа будет выглядеть так :
 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)

Всем спасибо за помощь и ответы!
Panaet
Всем привет я тут в первые не мгли бы вы мне помоч так как я начинаю толко не могу понять что в этом коде не так
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’))
он не выводит строки которые в иф и элиф без разницы ккие я ввел данные в х
Rodegast
> x == 16 == 18 == 20 == 22 == 25
  x in (16, 18, 20, 22, 25)
Panaet
Rodegast
Всепавно не выводит то что в иф и элиф
AD0DE412
Panaet
Всепавно не выводит то что в иф и элиф
пердположу что это просходит от того что вы не делаете преобразование типов после x = input('Диаметр арматуры?''\n') и в результате сравниваете тёплое с мягким (str c int)
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