Как получить доступ к родительскому каталогу в Python - PullRequest
2 голосов
/ 11 августа 2011

Итак, у меня есть скрипт на Python, который мне дал мой друг, но у меня нет опыта работы с Python.Вот код для него:

from os import path, chdir, listdir, mkdir, getcwd
from sys import argv
from zipfile import ZipFile
from time import sleep

#Defines what extensions to look for within the file (you can add more to this)
IMAGE_FILE_EXTENSIONS = ('.bmp', '.gif', '.jpg', '.jpeg', '.png', '.tif', '.tiff')

#Changes to the directory in which this script is contained
thisDir,_ = path.split(path.abspath(argv[0]))
chdir(thisDir)

#Lists all the files/folders in the directory
fileList = listdir('.')
for file in fileList:

    #Checks if the item is a file (opposed to being a folder)
    if path.isfile(file):

        #Fetches the files extension and checks if it is .docx
        _,fileExt = path.splitext(file)
        if fileExt == '.docx':

            #Creates directory for the images
            newDirectory = path.join(thisDir + "\Extracted Items", file + " - Extracted Items")
            if not path.exists(newDirectory):
                mkdir(newDirectory)

            currentFile = open(file, "r")
            for line in currentFile:
                print line

            sleep(5)



            #Opens the file as if it is a zipfile
            #Then lists the contents
            try:
                zipFileHandle = ZipFile(file)
                nameList = zipFileHandle.namelist()

                for archivedFile in nameList:
                    #Checks if the file extension is in the list defined above
                    #And if it is, it extracts the file
                    _,archiveExt = path.splitext(archivedFile)
                    if archiveExt in IMAGE_FILE_EXTENSIONS:
                        zipFileHandle.extract(archivedFile, newDirectory)
                    if path.basename(archivedFile) == "document.xml":
                        zipFileHandle.extract(archivedFile, newDirectory)
                    if path.basename(archivedFile) == "document.xml.rels":
                        zipFileHandle.extract(archivedFile, newDirectory)
            except:
                pass

Для строки, которая читает newDirectory = path.join(thisDir + "\Extracted Items", file + " - Extracted Items")

Я хочу изменить это для доступа к родительскому каталогу thisDir, а затем создать \Extracted Items папка.Кто-нибудь знает, как лучше всего получить доступ к родительскому каталогу в python?

Ответы [ 2 ]

2 голосов
/ 31 августа 2013
import os.path,sys
CURRENT_DIR = os.path.dirname(__file__).replace('\\','/')
PARENT_DIR = os.path.abspath(os.path.join(CURRENT_DIR, os.pardir))
1 голос
/ 11 августа 2011

Вы можете получить доступ к родительскому каталогу с помощью функции split из модуля os.path.

from os.path import dirname, split, isdir
parent_dir = lambda x: split(x)[0] if isdir(x) else split(dirname(x))[0]

Поскольку у вас нет опыта работы с Python, краткое объяснение кода:
Оператор lambda определяет встроенную -функцию. Внутри этой функции троичное условие сначала оценивает, является ли данный путь x каталогом. Если это применимо, путь разделяется с помощью функции split. Если путь x является , а не каталогом, сначала вычисляется имя каталога, а затем путь разделяется.
Расщепление пути выглядит так: C:\Foo\Bar\file.spam => (C:\Foo\Bar\, file.spam)

Теперь посмотрим, что происходит при вызове функции:

path = r"C:\Foo\Bar\file.spam"
print "Parent directory of " + path + ":", parent_dir(path)

Родительский каталог C: \ Foo \ Bar \ file.spam: C: \ Foo \

Примечание. По моему мнению, родительский каталог файла является родительским каталогом каталога файла. Если вы не определите это так, ваша функция также может выглядеть так:

from os.path import dirname, split, isdir
parent_dir = lambda x: split(x)[0] if isdir(x) else dirname(x)
...