Suite

Déplacer le fichier de formes à l'aide de Python shutil ?

Déplacer le fichier de formes à l'aide de Python shutil ?


J'essaie de parcourir plusieurs fichiers de forme dans un dossier et de n'en déplacer que certains vers un nouveau dossier. Je fais cela en fonction du contenu du fichier DBF où j'utilise dbfread pour déterminer s'il doit être déplacé ou non. Tout cela fonctionne comme prévu, sauf qu'il ne déplace que le fichier DBF et non les fichiers .shp, .shx et .prj. fichiers puisque la logique est uniquement sur le DBF. Une façon dont je pensais pouvoir déplacer tous les fichiers serait d'ajouter le nom de base de ceux que je souhaite déplacer vers une liste, mais je semble échouer. Voici le code que j'utilise.

from dbfread import DBF MoveFolder_path = r"C:DataMove" move_list = [] pour le fichier dans la liste_répertoire : if file.split('.')[1] == 'dbf': file_basename = file.split('. ')[0] table = DBF(file, load=True) if table.records[0]['name'] == None : move_list.append(file_basename) pour movefile dans move_list : pour fichier dans directory_list : file_basename = fichier .split('.')[0] if file_basename == movefile: Shutil.move(file, MoveFolder_path)

Regarde ça:

import shutdown, os from dbfread import DBF MoveFolder_path = r"C:DataMove" move_list = [] for i in path: #path to your directory_list if i.endswith('.dbf'): dbf = os.path. join(path, i) table = DBF(dbf, load=True) if table.records[0]['name'] == None : move_list.append(dbf[:-4]) for i in path : name = i[:-4] si nom dans move_list : src = os.path.join(path, i) Shutil.move(src, MoveFolder_path)

Avec la solution de ne considérer que le contenu d'un fichier dbf, vous ne déplacez que le fichier dbf.

Si vous souhaitez déplacer tous les fichiers d'un "shapefile" (.shp,.shx,.dbf, .proj,… ) vous devez utiliser des modules Python traitant tous les fichiers en même temps qu'osgeo (GDAL/OGR), Fiona ou Pyshp (shapefile) et copiez les fichiers de formes résultants dans le nouveau répertoire

Une solution avec Fiona (tous les résultats sont des dictionnaires Python) par exemple

import glob, os import fiona MoveFolder_path = r"C:DataMove" for file in glob.glob("*.shp"): shp = fiona.open(file) # première fonctionnalité du shapefile if shp.next( )['properties']['name'] == None : # conserve le schéma du fichier de formes d'origine, y compris le crs meta = shp.meta # copie le fichier de formes dans le nouveau répertoire newPath = os.path.join(MoveFolder_path, shp.path) avec fiona.open(newPath, 'w', **meta) en sortie : pour la fonctionnalité dans shp : output.write(feature)

Si vous souhaitez supprimer les fichiers originaux après la copie

1) avec Fiona >= 1,7

fiona.remove(shp.path, driver="ESRI Shapefile")

2) avec osgeo

depuis osgeo import ogr driver = ogr.GetDriverByName("ESRI Shapefile") driver.DeleteDataSource(shp.path)

Nouvelle

Les résultats de dbfread et Fiona pour les fichiers dbf sont les mêmes (dictionnaires) mais le résultat de Fiona est un générateur/itérateur avec le protocole Iteration (next(),… ) et tous les avantages de la méthode pour les gros fichiers.

import fiona shp = fiona.open('test.shp') shp.next()['properties'] # seul le premier élément est chargé OrderedDict([(u'dip_dir', 165), (u'dip', 67) , (u'nom', u")])

En revanche, lorsque vous utilisez dbfread

Par défaut, les enregistrements seront diffusés directement à partir du disque. Si vous passez load=True, ils seront plutôt chargés dans des listes et rendus disponibles en tant qu'enregistrements et attributs supprimés.

from dbfread import DBF table = DBF("test.dbf", load = True) # tous les éléments sont chargés dans une liste table[0] OrderedDict([(u'dip_dir', 165), (u'dip', 67 ), (u'nom', u")])

Si vous voulez un générateur/itérateur comme dans Fiona

Si la table n'est pas chargée, les enregistrements et les attributs supprimés renvoient des objets RecordIterator.

table = DBF("test.dbf") iter(table.records).next() # seul le premier élément est chargé OrderedDict([(u'dip_dir', 165), (u'dip', 67), (u' nom', u")])

La partie géométrique du shapefile (.shp) est minime dans les gros fichiers et travailler uniquement avec le fichier dbf n'est pas forcément plus efficace et plus rapide (et 40 Mo ce n'est pas gros)

  • avec les Shutils, vous devez connaître tous les fichiers associés au fichier dbf (.shp,… ) et les déplacer après votre script.
  • avec Fiona c'est automatique

Voir la vidéo: Créer fichier de formes. ArcGIS. arcgis الدرس 02 احتراف