Suite

Lecture de la ligne suivante de la colonne *.txt dans ArcPy pour la boucle pour le traitement par lots ?


Je ne sais pas comment aborder ce problème avec python, mais en clair, j'aimerais renommer les rasters avec les noms donnés dans le fichier *.txt (voir capture d'écran) et concaténer le nom de base donné par le fichier texte avec le extension de fichier d'origine. Par exemple, je voudrais que snowdepthN0001.tif soit renommé en 12-Jul_02.tif

Jusqu'à présent, pour vérifier mes progrès, je n'ai pu imprimer que des lettres ou des caractères du fichier texte par ligne plutôt que tous les caractères de chaque ligne.

Quelqu'un voit ce que je rate ?

import os import arcpy from arcpy import env RASTER_DIR = r"C:VMsharedsmall_example_valley8SDpartINTRaster" env.workspace = RASTER_DIR date_file = open("timetest.txt", "r") pour raster dans arcpy.ListRasters(): fileName ,fileExtension = os.path.splitext(raster) pour la ligne dans date_file.read(): print row fileNameParts = row fileNameParts = fileName.split('_') compactFileName = row + fileExtension arcpy.Rename_management(raster,compactFileName) date_file. Fermer()

Voici à quoi ressemblent les noms de raster (il y en a 90).


Vous pouvez effectuer ce type de renommage en utilisant énumérer. L'idée générale est d'ajouter un index avec chaque nom de raster, puis d'appeler cet index pour référencer l'élément spécifique dans la liste des fichiers texte.

import arcpy arcpy.env.workspace = r'C:path	oinput
asters' txtfile = r'C:path	o	extfile.txt' # Génère une liste d'éléments à partir d'un fichier texte avec open(txtfile, 'r') as f: names = [line.strip() for line in f] # Lister tous les rasters rasters = arcpy.ListRasters() rasters2 = list(enumerate(rasters)) # Boucler les rasters et renommer pour i ,r dans rasters2 : outname = names[i] + ".tif" arcpy.Rename_management(r, outname)

J'éviterais d'utiliser ArcGIS (arcpy) dans ce cas et le ferais en utilisant une solution Python pure. Ce sera plus rapide et beaucoup plus propre. Puisque vous renommez des fichiers tif, vous n'avez pas besoin d'utiliser ListRasters() ou arcpy.Rename()… voir cet exemple :

import os import glob def rename_files(new_names_file, file_folder): files_list = glob.glob(os.path.join(file_folder, '*.tif')) fp = open(new_names_file, 'rb') pour tif_file dans trié(files_list) : nouveau_nom = fp.next().strip() os.rename(tif_file, os.path.join(os.path.dirname(tif_file), "{0}.tif".format(new_name))) fp.close () if __name__ == '__main__': names_file = r"C:GISData	iffs
ew_names.txt" tif_folder = r"C:GISData	iffs" rename_files(names_file, tif_folder)

Comment lire de gros fichiers texte en Python, ligne par ligne, sans les charger en mémoire ?

J'ai besoin de lire un gros fichier, ligne par ligne. Disons que le fichier a plus de 5 Go et que j'ai besoin de lire chaque ligne, mais évidemment je ne veux pas utiliser readlines() car cela créera une très grande liste dans la mémoire.

Comment le code ci-dessous fonctionnera-t-il dans ce cas ? Est-ce que xreadlines lui-même lit un par un dans la mémoire ? L'expression du générateur est-elle nécessaire ?

De plus, que puis-je faire pour lire ceci dans l'ordre inverse, tout comme la commande Linux tail ?


10 réponses 10

Une solution awk vue sur #bash (Freenode):

Il existe une méthode simple (qui ne veut pas dire évidente) utilisant des utilitaires standard qui ne nécessitent pas une grande mémoire sauf pour exécuter sort , qui dans la plupart des implémentations a des optimisations spécifiques pour les fichiers volumineux (un bon algorithme de tri externe). Un avantage de cette méthode est qu'elle ne boucle que sur toutes les lignes à l'intérieur d'utilitaires spéciaux, jamais à l'intérieur de langages interprétés.

Si toutes les lignes commencent par un caractère non blanc, vous pouvez vous passer de certaines des options :

Pour une grande quantité de duplication, une méthode qui ne nécessite de stocker qu'une seule copie de chaque ligne en mémoire sera plus performante. Avec un peu de surcharge d'interprétation, il existe un script awk très concis pour cela (déjà publié par enzotib):


1. Extensions de fichiers et types de fichiers

La première étape pour travailler avec des fichiers de valeurs séparées par des virgules (CSV) consiste à comprendre le concept de types de fichiers et d'extensions de fichiers.

  1. Les données sont stockées sur votre ordinateur dans des “fichiers” ou des conteneurs, chacun portant un nom différent.
  2. Chaque fichier contient des données de différents types – les éléments internes d'un document Word sont assez différents des éléments internes d'une image.
  3. Les ordinateurs déterminent comment lire les fichiers à l'aide de l'extension “file”, c'est-à-dire le code qui suit le point (“.”) dans le nom du fichier.
  4. Ainsi, un nom de fichier se présente généralement sous la forme “<random name>.<file extension>”. Exemples:
    • projet1.DOCX – un fichier Microsoft Word appelé Project1.
    • fichier_shanes.TXT – un simple fichier texte appelé shanes_file
    • IMG_5673.JPG – Un fichier image appelé IMG_5673.
    • D'autres types de fichiers et extensions bien connus incluent : XLSX : Excel, PDF : Portable Document Format, images PNG –, format de fichier compressé ZIP –, animation GIF –, vidéo MPEG –, MP3 – musique etc. Voir une liste complète des extensions ici.
  5. Un fichier CSV est un fichier avec une extension de fichier “.csv”, par ex. “data.csv”, “super_information.csv”. Le “CSV” dans ce cas permet à l'ordinateur de savoir que les données contenues dans le fichier sont au format “valeur séparée par des virgules”, dont nous parlerons ci-dessous.

Les extensions de fichiers sont masquées par défaut sur de nombreux systèmes d'exploitation. La première étape que tout ingénieur, ingénieur logiciel ou data scientist qui se respecte effectuera sur un nouvel ordinateur est de s'assurer que les extensions de fichiers sont affichées dans leurs fenêtres Explorer (Windows) ou Finder (Mac).

Pour vérifier si les extensions de fichier s'affichent dans votre système, créez un nouveau document texte avec le Bloc-notes (Windows) ou TextEdit (Mac) et enregistrez-le dans un dossier de votre choix. Si vous ne voyez pas l'extension “.txt” dans votre dossier lorsque vous l'affichez, vous devrez modifier vos paramètres.

  • Sous Microsoft Windows : Ouvrez le Panneau de configuration > Apparence et personnalisation. Maintenant, cliquez sur Options de dossier ou alors Option de l'explorateur de fichiers, comme il s'appelle maintenant l'onglet Affichage >. Dans cet onglet, sous Paramètres avancés, vous verrez l'option Masquer les extensions pour les types de fichiers connus. Décochez cette option et cliquez sur Appliquer et OK.
  • Sous Mac OS : ouvrez le Finder > Dans le menu, cliquez sur Finder > Préférences, cliquez sur Avancé, cochez la case “Afficher toutes les extensions de nom de fichier”.

3 réponses 3

Vous avez beaucoup de booléens qui sont lancés et vous pourriez en éliminer beaucoup. if nextFlag == True est identique à if nextFlag , et ce dernier a l'air plus soigné, alors respectez-le.

Pour le flux principal, vous l'avez un peu en désordre. Vous ne devriez avoir qu'un seul indicateur, qui indique que les lignes doivent être supprimées ou ignorées. Vos deux drapeaux perturbent complètement le processus. Pensez-y de cette façon, vous avez besoin d'un indicateur pour indiquer qu'une partie doit être ignorée. Vous n'avez pas besoin de deux valeurs indiquant la même chose. Alors comment ça marche ?

Bien évidemment, vous commencez par chercher beginDelete . Nous devons d'abord vérifier si deleteFlag est True ou False . Si c'est vrai, nous voulons qu'il reste tel qu'il est jusqu'à ce que stopDelete soit trouvé et saute. Donc, si deleteFlag n'est pas True , nous le définissons comme le résultat de beginDelete dans la ligne . Vous pouvez affecter des expressions à des variables, même s'il s'agit d'une expression booléenne. Donc, sur cette base, nous n'avons pas besoin d'un autre contrôle if, nous pouvons simplement définir deleteFlag pour qu'il soit directement égal à ce résultat. Évidemment, cela signifie que le drapeau est maintenant True si nous avons trouvé beginDelete mais False sinon.

Maintenant, nous devons également trouver stopDelete pour transformer le drapeau sur False lorsqu'il est trouvé. Cela ne doit être exécuté que si deleteFlag est True , il devrait donc s'agir d'une condition else :

Vous pouvez maintenant voir que deleteFlag est défini selon que stopDelete a été trouvé ou non. Nous utilisons not pour que deleteFlag reste True jusqu'à ce que stopDelete soit trouvé. Une fois que cela se produit, deleteFlag est à nouveau False . Cependant, comme vous ne voulez pas écrire la ligne où vous venez de trouver stopDelete, vous devez utiliser continue pour passer à l'itération suivante de la ligne. continue est un mot-clé qui indique à une boucle de passer immédiatement à l'itération suivante, en ignorant tout code restant dans le bloc de la boucle.

Maintenant, l'écriture dans le fichier est facile. Vous voulez juste écrire sinon deleteFlag , c'est-à-dire. si le drapeau n'est pas True .


Approche grep

Pour créer une copie du fichier sans lignes correspondant à "cat" ou "rat", on peut utiliser grep à l'envers ( -v ) et avec l'option mot entier ( -w ).

L'option de mot entier garantit qu'elle ne correspondra pas à des chats ou à des remerciements, par exemple. La redirection de sortie de votre shell est utilisée ( > ) pour l'écrire dans un nouveau fichier. Nous avons besoin de l'option -E pour activer les expressions régulières étendues pour la syntaxe (une|autre).

Approche sed

Alternativement, pour supprimer les lignes en place, vous pouvez utiliser sed -i :

Le  définit les limites des mots et l'opération d supprime la ligne correspondant à l'expression entre les barres obliques. cat et rat correspondent tous deux à la syntaxe (l'une | l'autre) que nous devons apparemment échapper avec des barres obliques inverses.

Astuce : utilisez sed sans l'opérateur -i pour tester la sortie de la commande avant d'écraser le fichier.


Oui c'est possible, il suffit de rediriger la sortie (AKA stdout ) vers un fichier :

Ou si vous souhaitez ajouter des données :

Si vous voulez aussi stderr, utilisez ceci :

si vous voulez avoir à la fois stderr et output affiché sur la console et dans un fichier utilisez ceci:

(Si vous voulez uniquement la sortie, supprimez les 2 ci-dessus)

Pour écrire la sortie d'une commande dans un fichier, il existe essentiellement 10 méthodes couramment utilisées.

Aperçu:

Veuillez noter que le n.e. dans la colonne de syntaxe signifie "pas existant".
Il y a un moyen, mais c'est trop compliqué pour rentrer dans la colonne. Vous pouvez trouver un lien utile dans la section Liste à ce sujet.

Le flux de sortie standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, il est écrasé.

Le flux de sortie standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

Le flux d'erreur standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, il est écrasé.

Le flux d'erreur standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

La sortie standard et le flux d'erreur standard seront redirigés vers le fichier uniquement, rien ne sera visible dans le terminal. Si le fichier existe déjà, il est écrasé.

La sortie standard et le flux d'erreur standard seront redirigés vers le fichier uniquement, rien ne sera visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

Le flux de sortie standard sera copié dans le fichier, il sera toujours visible dans le terminal. Si le fichier existe déjà, il est écrasé.

Le flux de sortie standard sera copié dans le fichier, il sera toujours visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

Bash n'a pas de syntaxe abrégée qui permet de rediriger uniquement StdErr vers une deuxième commande, qui serait à nouveau nécessaire ici en combinaison avec tee pour compléter le tableau. Si vous avez vraiment besoin de quelque chose comme ça, veuillez regarder "Comment canaliser stderr et non stdout?" sur Stack Overflow pour savoir comment cela peut être fait, par exemple. en échangeant des flux ou en utilisant la substitution de processus.

La sortie standard et les flux d'erreurs standard seront copiés dans le fichier tout en restant visibles dans le terminal. Si le fichier existe déjà, il est écrasé.

La sortie standard et les flux d'erreurs standard seront copiés dans le fichier tout en restant visibles dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.


10 réponses 10

N'utilisez pas de mot de passe. Générez une clé SSH sans phrase de passe et transmettez-la à votre machine virtuelle.

Si vous possédez déjà une clé SSH, vous pouvez ignorer cette étape… Appuyez simplement sur Entrée pour la clé et les deux phrases de passe :

Copiez vos clés sur le serveur cible :

Essayez maintenant de vous connecter à la machine, avec ssh '[email protected]' , et enregistrez-vous :

pour nous assurer que nous n'avons pas ajouté de clés supplémentaires auxquelles vous ne vous attendiez pas.

Vous pouvez également envisager d'utiliser ssh-agent si vous souhaitez essayer de protéger vos clés avec une phrase secrète.

Alors que la bonne réponse à votre question est sshpass (voir l'autre réponse pour plus de détails), il existe un moyen plus sécurisé - les clés SSH. Tu es juste trois étapes faciles loin de la solution :

Toutes les commandes suivantes sont exécutées côté client, c'est-à-dire votre machine

Entrez la commande suivante pour commencer à générer un paire de clés rsa:

Lorsque le message « Entrez le fichier dans lequel enregistrer la clé » apparaît, laissez simplement le nom de fichier vide en appuyant sur Entrée.

Lorsque le terminal vous demande de saisir une phrase secrète, laissez simplement ce champ vide et appuyez sur Entrée.

Copiez ensuite la paire de clés sur le serveur avec une simple commande:

vous pouvez maintenant vous connecter sans mot de passe:

/rsa4live.pub n'a pas fonctionné pour moi lors de la tentative de ssh-copy-id . &ndash Cees Timmerman 4 juin 15 à 10:08

/.ssh/tatu-key-ecdsa [email protected] &ndash Gabriel Fair 8 sept. 17 à 21:47

L'authentification unique SSH est généralement réalisée avec une authentification par clé publique et un agent d'authentification. Vous pouvez facilement ajouter votre clé de VM de test à un agent d'authentification existant (voir l'exemple ci-dessous). D'autres méthodes telles que gssapi/kerberos existent mais sont plus complexes.


Python liste tous les fichiers d'un répertoire

Ici, nous démontrons des fonctions qui aident à parcourir le système de fichiers et à rechercher les fichiers présents.

Méthode Os.walk()

Il rassemble les noms de fichiers présents dans un répertoire en parcourant le répertoire soit de haut en bas, soit de bas en haut. Il renvoie un tuple des trois suivants :

  • Racine: Obtient uniquement les dossiers de l'entrée.
  • Répertoire : Obtient les sous-répertoires de la racine.
  • Des dossiers: Obtient tous les fichiers de la racine et des répertoires donnés.

Trouver tous les fichiers texte dans les répertoires et sous-répertoires

Vous trouverez ci-dessous l'exemple de code Python imprimant tous les fichiers dans des répertoires et sous-répertoires donnés.

Après exécution, voici le résultat :

Répertorier tous les répertoires sous les répertoires et sous-répertoires donnés

Vérifiez l'exemple de code ci-dessous pour rechercher et imprimer tous les répertoires sous le répertoire/sous-répertoire donné.

Après exécution, voici le résultat :

Méthode Glob.glob()

Plusieurs fois, nous devons parcourir une liste de fichiers dans un répertoire ayant des noms correspondant à un modèle. Dans un tel cas, le module glob permet de capturer la liste des fichiers dans un répertoire donné avec une extension particulière.

Fonction glob()

Cette fonction récupère une liste de fichiers filtrés en fonction du modèle donné dans le nom de chemin. Nous pouvons prendre un chemin qui est absolu aussi bien que relatif. Les caractères génériques tels que * et ? sont également des symboles autorisés.

Un autre paramètre, récursif est désactivé (faux) par défaut. Si sa valeur est True, alors cette fonction recherche dans tous les sous-répertoires du répertoire courant et trouve les fichiers ayant le motif souhaité

Répertorier tous les fichiers du répertoire actuel ayant l'extension “.py”

Par exemple – Le code suivant répertorie tous les fichiers du répertoire actuel ayant l'extension “.py”.

Après exécution, voici le résultat :

Lire à propos de Python glob plus en détail.

Obtenir tous les répertoires dans un répertoire et des sous-répertoires spécifiés

Après avoir exécuté le code ci-dessus, voici le résultat :

Méthode Os.listdir() pour lister les fichiers texte

Il donne une liste comprenant les noms des fichiers dans le répertoire spécifié dans l'emplacement (chemin). La liste se trouve être dans un ordre aléatoire. Il exclut les ‘.’ et ‘..’ s'ils sont disponibles dans le dossier d'entrée.

Après exécution, voici le résultat :

Pour apprendre Python étape par étape, lisez ceci Tutoriel Python.

Vous pourriez aussi aimer

Pourquoi la taille des entiers Python est-elle différente des entiers en C ?

Types de données Python – Apprendre du basique au avancé


9 réponses 9

Voici quelques endroits où vous pourriez rendre votre code plus concis :

Tout d'abord, les lignes 2 à 11 prennent beaucoup d'espace et vous répétez ces valeurs ci-dessous lorsque vous affectez list1. Vous pourriez plutôt envisager d'essayer de combiner ces lignes en une seule étape. Une compréhension de liste peut vous permettre d'effectuer ces deux actions en une seule étape :

Une deuxième compréhension de liste pourrait affiner davantage vos résultats en supprimant les valeurs paires :

Vous pourrez alors voir si votre liste contient des valeurs. Si ce n'est pas le cas, aucune valeur impaire n'était dans votre liste. Sinon, vous pourriez trouver le max des valeurs qui restent dans votre liste, qui devraient toutes être impaires :

Au total, vous pouvez donc utiliser les éléments suivants comme point de départ pour affiner votre code :

Personne n'a donné le code que j'écrirais, qui ne crée pas de liste mais suit la réponse en boucle. La logique est un peu plus complexe, mais elle évite de stocker des valeurs (ici cela n'a pas vraiment d'importance, puisqu'il ne s'agit que de 10 valeurs, mais un problème similaire avec l'entrée d'un autre programme, pourrait avoir plus de données qu'il n'y en a en mémoire).

Notez que je traite les valeurs non nulles comme True , donc la valeur % 2 est un test de bizarrerie (car elle donne un reste non nul et Python traite les valeurs non nulles comme true ). De même, si maxOdd teste que maxOdd n'est pas None (ni zéro, mais il ne peut pas être zéro, car c'est pair).

Une autre façon, plus proche des autres réponses, dans la mesure où elle traite les nombres comme une séquence, mais en évitant toujours de tout stocker en mémoire, consiste à utiliser un générateur :

C'est plus "avancé", mais numbers() crée un Générateur, et la chaîne de fonctions max, filter, map, islice appelle effectivement cela pour chaque valeur (simplifiant légèrement). Le résultat final est donc une sorte de pipeline qui, encore une fois, évite de tout garder en mémoire.