ValueError: scandir: слишком длинный путь для Windows - PullRequest
0 голосов
/ 05 декабря 2018

Я пишу простой скрипт на Python, сообщающий мне размер файла для набора документов, который я импортирую из CSV.Я проверил, что ни одна из записей не содержит более 100 символов, поэтому эта ошибка «ValueError: scandir: путь слишком длинный для Windows» не имеет смысла для меня.

Вот мой код:

# determine size of a given folder in MBytes
import os, subprocess, json, csv, platform

# Function to check if a Drive Letter exists
def hasdrive(letter):
    return "Windows" in platform.system() and os.system("vol %s: 2>nul>nul" % (letter)) == 0

# Define Drive to check for
letter = 'S'

# Check if Drive doesnt exist, if not then map drive
if not hasdrive(letter):
    subprocess.call(r'net use s: /del /Y', shell=True)
    subprocess.call(r'net use s: \\path_to_files', shell=True)

list1 = []
# Import spreadsheet to calculate size
with open('c:\Temp\files_to_delete_subset.csv') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        list1.extend(row)

# Define variables
folder = "S:"
folder_size = 0

# Exporting outcome
for list1 in list1:
    folder = folder + str(list1)
    for root, dirs, files in os.walk(folder):
        for name in files:
            folder_size += os.path.getsize(os.path.join(root, name))
            print(folder)
            # print(os.path.join(root, name) + " " + chr(os.path.getsize(os.path.join(root, name))))

print(folder_size)

Насколько я понимаю, максимальный размер пути в Windows составляет 260 символов, поэтому 1 буква драйвера + путь в 100 символов НЕ должны превышать максимальный размер Windows.

Вот пример пути: '/ Document / 8669/CORRESP/1722165.doc'

1 Ответ

0 голосов
/ 05 декабря 2018

Строка folder, которую вы пытаетесь walk, растет вечно.Упрощение кода для проблемной области:

folder = "S:"

# Exporting outcome
for list1 in list1:
    folder = folder + str(list1)

В противном случае вы никогда не установите folder, поэтому оно начинается как S:<firstpath>, затем в следующем цикле это S:<firstpath><secondpath>, затем S:<firstpath><secondpath><thirdpath> и т. Д.Простое исправление: отдельный диск от folder:

drive = "S:"

# Exporting outcome
for path in list1:
    folder = drive + path

Теперь folder создается с нуля на каждом цикле, отбрасывая предыдущий путь, а не объединяя их.

Iтакже присвоил значению итерации полезное имя (и удалил вызов str, поскольку все значения должны быть уже str).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...