Попытка получить все файлы (в том числе только для чтения) из каталога с помощью Python

Я новичок в Python - извините, если мой вопрос кажется глупым.

Я пытаюсь получить все файлы, присутствующие в данной папке, и создать Excel, который показывает имя и путь к файлу.

Он отлично работает с некоторыми папками, но не со всеми. Причина, по которой я думаю, может быть, он не может получить данные, которые находятся в режиме только для чтения (я не совсем уверен в этом).

Вот ошибка, которую я получаю:

F: /
Traceback (последний вызов последним):
Файл "c: /Vamsi_Folder/4.Tutorials/Python/OS/01-WIP/Get Files From Directory / Get_Files_From_Directory.py", строка 36, в
Список = getListOfFiles (имя файла)

Файл "c: /Vamsi_Folder/4.Tutorials/Python/OS/01-WIP/Get Files From Directory / Get_Files_From_Directory.py", строка 30, в getListOfFiles
allFiles = allFiles + getListOfiles (fullPath)

Файл "c: /Vamsi_Folder/4.Tutorials/Python/OS/01-WIP/Get Files From Directory / Get_Files_From_Directory.py", строка 22, в getListOfFiles
listOfFile = os.listdir (dirName)

PermissionError: [WinError 5] Доступ запрещен: 'F: / Информация о системном томе'

Вот код, который я использую:

#program to write files from directory in Excel


import os
from openpyxl import Workbook
from openpyxl.worksheet.table import Table, TableStyleInfo
import numpy as np
from tkinter import Tk
from tkinter.filedialog import askdirectory
from tkinter.filedialog import asksaveasfilename
import ntpath


Tk().withdraw()
filename = askdirectory()
print(filename)


def getListOfFiles(dirName):
    # create a list of file and sub directories 
    # names in the given directory 
    listOfFile = os.listdir(dirName)
    allFiles = list()
    # Iterate over all the entries
    for entry in listOfFile:
        # Create full path
        fullPath = os.path.join(dirName, entry)
        # If entry is a directory then get the list of files in this directory 
        if os.path.isdir(fullPath):
            allFiles = allFiles + getListOfFiles(fullPath)
        else:
            allFiles.append(fullPath)

    return allFiles

List = getListOfFiles(filename)
Filename = []
for i in List:
    Filename.append(ntpath.basename(i))


workbook = Workbook()
worksheet = workbook.active
worksheet.title = "Directory"

outlist = [Filename,List]

transpose = np.array(outlist).T
transpose_outlist = transpose.tolist()

worksheet.append(["Filename","Path"])

for row in transpose_outlist:
    worksheet.append(row)

count = "A1:""B"+str(len(List)+1)

tab = Table(displayName="Directory", ref=count)
style = TableStyleInfo(name="TableStyleMedium9", showFirstColumn=False,
                       showLastColumn=False, showRowStripes=True, showColumnStripes=True)
tab.tableStyleInfo = style
worksheet.add_table(tab)

savename =asksaveasfilename(initialdir = "/",defaultextension="*.*",filetypes=\
                                     (("xml files","*.xml"),\
                                      ('xlsx files','.xlsx'),\
                                      ("all files","*.*")))

workbook.save(savename)

person user18457    schedule 14.06.2020    source источник


Ответы (1)


У вас нет доступа к «Системной информации о томе» раздела жесткого диска. Как получить доступ к папке с информацией о системном томе

Во-вторых, на мой взгляд, это лучший (питонический) код для получения списка всех файлов в каталоге и его подкаталогах.

import os
import csv

directory = r'F:/'

files_list = [d + '\\' + f for d, dirs, files in os.walk(directory) for f in files]

with open('dicrectory_files.csv', 'w', newline='') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(['basename', 'filepath'])
    for file in files_list:
        csv_writer.writerow([os.path.basename(file), file])

Затем вы можете напрямую открыть этот CSV в Excel.

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

directory = input('Enter directory path: ')
if directory == '':
    directory = os.getcwd()

Затем, когда вы запустите файл кода (.py), вам просто нужно скопировать и вставить путь к каталогу, по которому вы хотите пройти, в окне подсказки. CSV-файл будет создан в каталоге вашего файла кода.

person Raza Cheema    schedule 14.06.2020
comment
Спасибо за ваше предложение, но я готовлю его для своей команды. они будут использовать это для аудита входящих файлов, им нужна эта информация в Excel. Я знаю, что мы можем импортировать информацию csv в Excel, как бы это ни требовалось для вывода в Excel. - person user18457; 14.06.2020
comment
Есть ли способ пропустить эту конкретную папку, если в доступе отказано. Я имею в виду, что я хочу, чтобы программа продолжала работать, даже если доступ запрещен к одной папке. - person user18457; 14.06.2020
comment
@ user18457 os.walk по умолчанию игнорирует любые ошибки, возникающие при просмотре каталогов. Таким образом, по умолчанию ошибка отказа в доступе не должна быть проблемой, так как она будет проигнорирована. Но если вы хотите что-то сделать с этой ошибкой, например, распечатать сообщение об ошибке, вы можете передать настраиваемую функцию в onerror аргумент os.walk, точно так же, как этот ответ. - person Raza Cheema; 14.06.2020
comment
Спасибо, я переписал свой код с помощью os.walk, он работает как шарм - person user18457; 15.06.2020
comment
Есть ли способ получить информацию о свойствах файла. как будто я хочу получить тип файла из свойств. - person user18457; 15.06.2020
comment
Вы можете проверить тип файла по его расширению. Используйте функцию os.path.splitext. или используйте функцию os.stat, чтобы проверить другую статистику файла. Или лучше было бы использовать PowerShell, если вы используете окна. Dir 'F:/' -Recurse | Select-Objects * | ConvertTo-CSV | Out-File '.\directory files.csv' - person Raza Cheema; 16.06.2020
comment
Для получения справки по Powershell Dir Command - person Raza Cheema; 16.06.2020