IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

copier des fichiers de plusieurs dossiers vers un dossier unique [Python 2.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut copier des fichiers de plusieurs dossiers vers un dossier unique
    Bonjour,
    voila je cherche à copier tous les fichiers avec une extension .shp (shapelfile, fichier de SIG) qui sont présent dans plusieurs dossiers et sous dossiers vers un dossier commun.
    Donc j'ai chercher a droite à gauche comment faire et je pensais y être arriver, mais enfaite le code beug sur un sous dossier et là je bloque vraiment.
    Deplus j'avais un problème de fichier qui portait le même nom que j'ai régler comme j'ai pu.

    Je me demande si le problème ne vient pas d'accent présent dans le nom de certain dossier. Mais le problème ne ce pose pas dans le traitement d'autres dossiers qui ont des sous-dossiers avec des accents. Et j'ai changé l'encodage sans résultat.

    SI quelqu'un à une idée de l'origine probable du problème, vers ou je devrai chercher
    Et si au passage il y en a qui me guide pour optimiser le code je suis preneur aussi.....

    et au cas vous n'avez pas compris je suis pas un expert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    ####  Recherche et copies de .shp dans des répertoires cibles
    ####    en renomant la cible avec le dossier source
    ####
     
    import arcpy, os, locale
    from arcpy import env
     
    dossier1 = r"E:\diag_preventif"
    dossier2 = r"E:\site"
    env.workspace = r"E:\SIG\importSIG"
    types=".shp"
    try:
        ##traitement du dossier 1
        ##liste des dossiers et fichiers du dossier1
        for f in os.listdir(dossier1):
            ##identification des dossiers
            if os.path.isdir(os.path.join(dossier1, f)):
                print f
                ##itération dans les sous-dossiers pour extraire les shapefiles
                path = os.path.join(dossier1, f)
                for dir, dirnames, files in arcpy.da.Walk(path):
                    for file in files:
                        if file[-4:] in types:
                            out_name = f + "_" + file
                            newname = os.path.join(env.workspace, out_name)
                            filepath = os.path.join(dir, file)
                            code_site = "'%s'" % f
                            if os.path.isfile(newname):
                                out_name2 = f + "_" + file[:-4] + "_2.shp"
                                newname2 = os.path.join(env.workspace, out_name2)
                                if os.path.isfile(newname2):
                                    out_name3 = f + "_" + file[:-4] + "_3.shp"
                                    newname3 = os.path.join(env.workspace, out_name3)
                                    arcpy.Copy_management(filepath, newname3, "FeatureClass")
                                    arcpy.AddField_management(newname3, "code_site", "TEXT", "", "", "50") 
                                    arcpy.CalculateField_management(newname3, "code_site", code_site, "PYTHON_9.3")
                                else:                            
                                    arcpy.Copy_management(filepath, newname2, "FeatureClass")
                                    arcpy.AddField_management(newname2, "code_site", "TEXT", "", "", "50") 
                                    arcpy.CalculateField_management(newname2, "code_site", code_site, "PYTHON_9.3")
                            else:
                                arcpy.Copy_management(filepath, newname, "FeatureClass")
                                arcpy.AddField_management(newname, "code_site", "TEXT", "", "", "50")
                                arcpy.CalculateField_management(newname, "code_site", code_site, "PYTHON_9.3")                       
        print "fin dossier1"
     
        ##traitement du dossier 2, traitement idem que dossier1
        for f in os.listdir(dossier2):
            if os.path.isdir(os.path.join(dossier2, f)):
                print f
                path = os.path.join(dossier2, f)
                for dir, dirnames, files in arcpy.da.Walk(path):
                    for file in files:
                        if file[-4:] in types:
                            out_name = f + "_" + file
                            newname = os.path.join(env.workspace, out_name)
                            filepath = os.path.join(dir, file)
                            code_site = "'%s'" % f
                            if os.path.isfile(newname):
                                out_name2 = f + "_" + file[:-4] + "_2.shp"
                                newname2 = os.path.join(env.workspace, out_name2)
                                if os.path.isfile(newname2):
                                    out_name3 = f + "_" + file[:-4] + "_3.shp"
                                    newname3 = os.path.join(env.workspace, out_name3)
                                    arcpy.Copy_management(filepath, newname3, "FeatureClass")
                                    arcpy.AddField_management(newname3, "code_site", "TEXT", "", "", "50") 
                                    arcpy.CalculateField_management(newname3, "code_site", code_site, "PYTHON_9.3")
                                else:                            
                                    arcpy.Copy_management(filepath, newname2, "FeatureClass")
                                    arcpy.AddField_management(newname2, "code_site", "TEXT", "", "", "50") 
                                    arcpy.CalculateField_management(newname2, "code_site", code_site, "PYTHON_9.3")
                            else:
                                arcpy.Copy_management(filepath, newname, "FeatureClass")
                                arcpy.AddField_management(newname, "code_site", "TEXT", "", "", "50")
                                arcpy.CalculateField_management(newname, "code_site", code_site, "PYTHON_9.3")
        print "fin dossier2"
     
        ##regroupement des shapefiles
     
        fcList1 = arcpy.ListFeatureClasses("", "point")
        fcList2 = arcpy.ListFeatureClasses("", "polygone")
        fcList3 = arcpy.ListFeatureClasses("", "polyline")
        arcpy.Merge_management(fcList1, os.path.join(env.workspace, "all_pt.shp"))
        arcpy.Merge_management(fcList2, os.path.join(env.workspace, "all_plg.shp"))
        arcpy.Merge_management(fcList3, os.path.join(env.workspace, "all_pl.shp"))
     
     
        print "Ouaisssssssss c finit"
     
     
     
     
    except Exception as e:
        print e.message
        arcpy.AddError(e.message)
    merci d'avance

    j'ai aussi poster le problème sur forum SIG
    http://www.forumsig.org/showthread.p...ers-un-dossier

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Qu'est-ce que ton code fait de plus que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    shp_files = []
    for root, dirs, files in os.walk(dossier1)
        for f in files:
            if os.path.splitext(f)[1].lower() == '.shp':
                shp_files.append(os.path.join(root, f))
     
    for shp in shp_files:
        dest = os.path.join(dossier_destination, os.path.basename(shp))
        # Ici gérer les doublons !!
        shutil.copy(shp, dest)
    ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    bonjour,
    ta réponse m'a bien aidé
    par contre les .shp son des fichiers spécifique qui dépende d'autres fichiers avec des extensions différentes.
    C'est pourquoi la commande pyhton d'arcgis est plus simple que de s'amuser à lister tous les .shp et leur fichier associé

    en plus de copier les fichiers le script fait un calcul sur les tables, mais bon le problème ne venait pas de là
    j'ai dut virer un dossier sur lequel la recherche bloquer pour je ne sais quel raison, mais maintenant ça fonction

    après plusieurs bidouille ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    ####  Recherche et copies de .shp dans des répertoires cibles
    ####    en renomant la cible avec le dossier source
    ####
     
    import arcpy, os, glob
    from arcpy import env
     
    dossier1 = r"E:\diag_preventif"
    env.workspace = r"E:\SIG\importSIG"
     
     
    def copies (name, out_name):
        arcpy.Copy_management(name, out_name, "FeatureClass")
        arcpy.AddField_management(out_name, "code_site", "TEXT", "", "", "50")
        arcpy.CalculateField_management(out_name, "code_site", code_site, "PYTHON_9.3")
     
     
    try:
        ##traitement du dossier 1
        ##liste des dossiers et fichiers du dossier1
        list_shp = []
        ##itération dans les sous-dossiers pour extraire les shapefiles
        for dir, dirnames, files in arcpy.da.Walk(dossier1, datatype="FeatureClass"):
            for file in files:
                if os.path.splitext(file)[1].lower() == ".shp" :
                    print os.path.join(dir, file)
                    list_shp.append(os.path.join(dir, file))
     
        for shp in list_shp:
            print shp
            code_site = "'%s'" % shp.split("\\")[2]
            if os.path.isfile(os.path.join(env.workspace, shp.split("\\")[2] + "_" + os.path.basename(shp))):
                ## traitement si doublon
                num =[]
                if os.path.isfile(os.path.join(env.workspace, shp.split("\\")[2] + "_" + os.path.basename(shp)[:-4] + "-2.shp")):
                    doublons = glob.glob(os.path.join(env.workspace, shp.split("\\")[2] + "_" + os.path.basename(shp))[:-4] + "-*.shp")
                    for d in doublons:
                        num.append(int(os.path.splitext(os.path.basename(d))[0].split("-")[-1]))
                    num.sort()
                    newnum = str(num[-1] + 1)
                    newname = os.path.join(os.path.splitext(shp)[0] + "-" + newnum + ".shp")
                    copies(shp, newname)
                else:   
                    copies(shp, os.path.join(env.workspace, shp.split("\\")[2] + "_" + os.path.basename(shp)[:-4] + "-2.shp"))                        
            else:
                copies(shp, os.path.join(env.workspace, shp.split("\\")[2] + "_" + os.path.basename(shp)))
     
     
        print "fin dossier1"
     
     
    except Exception as e:
        print e.message
        arcpy.AddError(e.message)
    je voulais faire un "def doublon" aussi mais g pas réssit
    mais bon
    merci

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    def set_unique_name(path):
        """Retourne path augmenté d'un indice si le fichier existe déjà.
     
        Args:
        path -- Chemin complet du fichier
        """
        fld, base = os.path.split(path)
        name, ext = os.path.splitext(base)
        count = 1
        while 1:
            if os.path.isfile(path):
                path = os.path.join(fld, "%s_%s%s" %( base, count, ext))
                count += 1
            else:
                return path

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    merci
    oui j'avais vu un truc avec +=, mais je comprenais pas trop comment ça fonctionnait.

    bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Copier des données depuis plusieurs classeurs vers un classeur de Recap
    Par bdel1724 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/11/2014, 20h14
  2. [vbs] Copier des fichiers depuis plusieurs DVD
    Par anthoof dans le forum VBScript
    Réponses: 2
    Dernier message: 28/04/2014, 12h20
  3. [WD14] Copier des fichiers vers un serveur HyperFile C/S
    Par ecoinfo dans le forum WinDev
    Réponses: 1
    Dernier message: 14/06/2010, 20h09
  4. [XL-2003] copier des dates d'un onglets vers plusieur onglet une date une onglet
    Par toutletoutim dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/04/2010, 17h23
  5. Copier des cellules de plusieurs fichiers et les trier automatiquement
    Par nicethe dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/10/2008, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo