Нужен код для возврата только имени каталога - PullRequest
1 голос
/ 20 сентября 2010

Я новичок в Python и получил скрипт, который позволяет пользователю вводить каталог где находятся шейп-файлы (например, c: \ programfiles \ shapefiles). Затем он создает поле в каждом шейп-файле и добавляет введенный путь к каталогу и имя шейп-файла (например, c: \ programfiles \ shapefiles \ name.shp). Я хотел бы заполнить поле только имя каталога (например, шейп-файлы). Я знаю, что есть команда, которая разделит имя каталога, но как мне вернуть базовое имя как функцию? Заранее спасибо.

import sys, string, os, arcgisscripting
gp = arcgisscripting.create()

# this is the directory user must specify
gp.workspace = sys.argv[1]
# declare the given workspace so we can use it in the update field process
direct = gp.workspace
try:
    fcs = gp.ListFeatureClasses("*", "all")
    fcs.reset()
    fc = fcs.Next()


    while fc:
        fields = gp.ListFields(fc, "Airport")
        field_found = fields.Next()
        # check if the field allready exist.
        if field_found:
            gp.AddMessage("Field %s found in %s and i am going to delete it" % ("Airport", fc))
            # delete the "SHP_DIR" field
            gp.DeleteField_management(fc, "Airport")
            gp.AddMessage("Field %s deleted from %s" % ("Airport", fc))
            # add it back
            gp.AddField_management (fc, "Airport", "text", "", "", "50")
            gp.AddMessage("Field %s added to %s" % ("Airport", fc))
            # calculate the field passing the directory and the filename
            gp.CalculateField_management (fc, "Airport", '"' + direct + '\\' + fc + '"')
            fc = fcs.Next()


        else:
            gp.addMessage(" layer %s has been found and there is no Airport" % (fc))
        # Create the new field
            gp.AddField_management (fc, "Airport", "text", "", "", "50")
            gp.AddMessage("Field %s added to %s" % ("Airport", fc))

        # Apply the directory and filename to all entries       
            gp.CalculateField_management (fc, "Airport", '"' + direct + '\\' + fc + '"')
            fc = fcs.Next()
        gp.AddMessage("field has been added successfully")
        # Remove directory

except:
 mes = gp.GetMessages ()
 gp.AddMessage(mes)

Ответы [ 2 ]

1 голос
/ 20 сентября 2010

Соответствующие функции: http://docs.python.org/library/os.path.html

Для имени каталога, включая родительский путь, если доступно:

os.path.dirname(your_full_filename)

Для имени каталога, включая абсолютный родительский путь:

os.path.dirname(os.path.abspath(your_full_filename))

Только для имени:

os.path.split(os.path.dirname(your_full_filename))[-1]
0 голосов
/ 07 декабря 2012
import os    

def getparentdirname(path):
    if os.path.isfile(path):
        dirname = os.path.dirname(path)
        return os.path.basename(dirname[0:-1] if dirname.endswith("\\") else dirname)
    else:
        return os.path.basename(path[0:-1] if dirname.endswith("\\") else path)

Это должно сработать, хотя оно зависит от пути на вашем компьютере (так что os.path.isfile может проверить, является ли путь файлом или каталогом)

...