2010-08-25 2 views
1

Ниже приведен код python, содержащий список файлов и их zip-файлы. Единственная файловая база геоданных (файловая база данных), которую мне нужно иметь, называется «данные», поэтому как я могу изменить цикл, чтобы включить только базу данных на основе файлов под названием «Данные»? Чтобы быть более конкретным, база данных геоданных хранится в виде системной папки, содержащей двоичные файлы, которые хранят и управляют пространственными данными. Поэтому мне нужна вся системная папка Data.gdb.Обновление для каждой петли в Python

Большое спасибо

#********************************************************************** 
# Description: 
# Zips the contents of a folder, file geodatabase or ArcInfo workspace 
# containing coverages into a zip file. 
# Parameters: 
# 0 - Input workspace 
# 1 - Output zip file. It is assumed that the caller (such as the 
#  script tool) added the .zip extension. 
# 
#********************************************************************** 

# Import modules and create the geoprocessor 
import sys, zipfile, arcgisscripting, os, traceback 
gp = arcgisscripting.create() 

# Function for zipping files 
def zipws(path, zip): 
    isdir = os.path.isdir 

    # Check the contents of the workspace, if it the current 
    # item is a directory, gets its contents and write them to 
    # the zip file, otherwise write the current file item to the 
    # zip file 
    # 
    for each in os.listdir(path): 
     fullname = path + "/" + each 
     if not isdir(fullname): 
      # If the workspace is a file geodatabase, avoid writing out lock 
      # files as they are unnecessary 
      # 
      if not each.endswith('.lock'): 
       # gp.AddMessage("Adding " + each + " ...") 
       # Write out the file and give it a relative archive path 
       # 
       try: zip.write(fullname, each) 
       except IOError: None # Ignore any errors in writing file 
     else: 
      # Branch for sub-directories 
      # 
      for eachfile in os.listdir(fullname): 
       if not isdir(eachfile): 
        if not each.endswith('.lock'): 
         # gp.AddMessage("Adding " + eachfile + " ...") 
         # Write out the file and give it a relative archive path 
         # 
         try: zip.write(fullname + "/" + eachfile, \ 
             os.path.basename(fullname) + "/" + eachfile) 
         except IOError: None # Ignore any errors in writing file 


if __name__ == '__main__': 
    try: 
     # Get the tool parameter values 
     # 
     inworkspace = sys.argv[1] 
     outfile = sys.argv[2]  

     # Create the zip file for writing compressed data 
     # 
     zip = zipfile.ZipFile(outfile, 'w', zipfile.ZIP_DEFLATED) 
     zipws(inworkspace, zip) 
     zip.close() 

     # Set the output derived parameter value for models 
     # 
     gp.setparameterastext(1, outfile) 
     gp.AddMessage("Zip file created successfully") 

    except: 
     # Return any python specific errors as well as any errors from the geoprocessor 
     # 
     tb = sys.exc_info()[2] 
     tbinfo = traceback.format_tb(tb)[0] 
     pymsg = "PYTHON ERRORS:\nTraceback Info:\n" + tbinfo + "\nError Info:\n " + \ 
       str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n" 
     gp.AddError(pymsg) 

     msgs = "GP ERRORS:\n" + gp.GetMessages(2) + "\n" 
     gp.AddError(msgs) 
+0

Нет, Data.gdb это имя базы данных на основе файлов, и это единственный файл, я хочу на застежку. Все остальные файлы, которые я не хочу включать в zip-файл. – Josh

+0

Если «Data.gdb» - это каталог, то это должна быть аргумент командной строки для этой программы, и все готово. Программирование не требуется. –

ответ

1

Лучший способ пройти через дерево каталогов является os.walk - делает разделение файлов/реж для вас, а также делает рекурсию вниз подкаталогов для вас.

Итак:

def zipws(path, zip, filename='Data.gdb'): 
    for root, dirs, files in os.walk(path): 
    if filename in files: 
     zip.write(os.path.join(root, filename), 
       os.path.join(os.path.basename(root), filename)) 
     return 

Я не уверен, что я захватил всю логику, с которой вы хотите, чтобы определить два аргумента в zip.write (это не очевидно для меня из вашего кода), но, если нет, это должно быть легко настроить.

Кроме того, я не уверен, что если вы хотите, чтобы return в конце: эффект сжать только один файла с именем, способом, в отличие от проносясь всех файлов с именем таким образом, что может произойти в дереве (в соответствующих подкаталогах). Если вы знаете, что есть только один такой файл, он может также оставить return (он просто немного ускорит работу). Если вам нужны все такие файлы, когда их больше одного, удалите return.

Edit: получается, что «одна вещь» ОП хочет это каталог, а не файл. В этом случае, я хотел бы предложить, как самое простое решение:

def zipws(path, zip, dirname='Data.gdb'): 
    for root, dirs, files in os.walk(path): 
    if os.path.basename(root) != dirname: continue 
    for filename in files: 
     zip.write(os.path.join(root, filename), 
       os.path.join(dirname, filename)) 
    return 

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

+0

Привет, Алекс. Я обновил свой вопрос выше, чтобы предоставить более подробную информацию о Data.gdb (это системная папка с несколькими двоичными файлами). Также я прокомментировал всю свою функцию zipws и добавил ваш код, а также обновил zipws (inworkspace, zip), чтобы быть zipws (inworkspace, zip, filename), но когда я его запускал, я получаю синтаксическую ошибку.Мысли? – Josh

+0

@ Josh, я последний раз, я просто опечатал закрытый парик - редактирование, чтобы исправить. Если одна вещь, которую вы ищете, это каталог, а не файл, простейшим IMHO является поиск базового имени root - так как я редактирую в любом случае, я покажу новую версию. –

+0

Хорошая работа Алекс. Это сработало. – Josh

0

Начало этой линии:

zipws(inworkspace, zip) 

Вы не хотите использовать эту эту функцию, чтобы создать почтовый файл из нескольких файлов. Кажется, вы хотите создать zip-файл с одним членом.

Замените его на это.

 try: 
     zip.write(os.path.join('.', 'Data.gdb')) 
    except IOError: 
     pass # Ignore any errors in writing file 

Выбросьте функция zipws которой - судя по всему - не хотите использовать.

Прочитайте это, он может помочь: http://docs.python.org/library/zipfile.html

+0

Data.gdb - это несколько файлов, поскольку это база данных на основе файлов. Так будет ли это проблемой? – Josh

+0

@Josh: Вы должны ** обновить ** свой вопрос, чтобы быть очень конкретным в этом вопросе. Неясно, что означает это имя. Это «каталог»? Или это «файл»? Пожалуйста, обновите свой вопрос, чтобы предоставить недостающую информацию. –

+0

обновлено, спасибо – Josh

 Смежные вопросы

  • Нет связанных вопросов^_^