0
votes

Comment changer une partie des noms de fichiers à l'aide des modules SYS et Subprocess et Linux Bash

J'ai un script python qui lit les noms de fichiers à partir d'OldFiles.txt, iTERE via des noms de fichiers qui sont des fichiers dans un répertoire Linux, puis mettez à jour les noms de fichiers à l'aide de chaîne.replace et exécutez enfin un sous-processus pour trouver ces fichiers (disons dans Répertoire à domicile pour faciliter l'explication et la démo) et modifier leurs noms à l'aide de

#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r') as f:
    content1 = f.readlines()
    content2 = [x.strip() for x in content1]
    content3 = [item.replace("jane", "jdoe") for item in content2]
    for x in content2:
      for i in content3:
        subprocess.run(['mv', '/home/ninja-coder/'+x, '/home/ninja-coder/'+i])


3 commentaires

Vous avez omnuent la solution. Oubliez les sous-processus et jetez un coup d'œil à os.Rename .


Salut chic. En fait, je suis obligé d'utiliser des modules SYS et Subprocess, c'est une évaluation des devoirs.


S'il vous plaît upvote si vous trouvez ma question pertinente. Merci.


4 Réponses :


0
votes

Utiliser un sous-processus pour renommer un fichier est trop coûteux et trop cher pour vous. Renommez le fichier avec les outils que Python vous offre. En outre, vous n'avez pas besoin d'ouvrir le fichier pour écrire et vous pouvez itérer via le fichier simplement mentionner le fichier: xxx


1 commentaires

S'il vous plaît upvote si vous trouvez ma question pertinente. Merci.



0
votes

Je ne suis pas sûr de savoir pourquoi vous souhaitez ouvrir un fichier si vous souhaitez modifier le nom de fichier. Je pense que vous voulez itérer sur tous les fichiers d'un répertoire pour que vous ayez besoin de os.listdir () https://www.TutorialSpoint.com/python/os_listdir.html Xxx pré>

Comme @poshi a signalé aucun besoin de sous-processus OS.Rename devrait le faire https://www.Tutorialspoint.com/python/os_rrename.htm P >

Si vous voulez vraiment utiliser SubProcess P>

#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r') as f:
    for filename in f.readlines():
        newFilename = filename[:-1].strip().replace("jane", "jdoe")
        subprocess.run(['mv', "~/" + filename[:-1], "~/" + newFilename])


10 commentaires

Subprocess.Run (['MV', chemin + nom de fichier, chemin + newfileName]) mais je ne sais pas pourquoi Linux n'accepte pas les noms de variables comme chemin comme ~ / newline Ce qui est égal à un nom de fichier dans olffiles.txt et existe déjà dans le répertoire Linux.


Voici la sortie de votre script bro mv: impossible de stat '~ / sdafsdfs_jane.doc' $ '\ n': aucun fichier ou répertoire de ce type tandis que le nom du fichier est correct et que les fichiers sont là. Mais je ne sais pas pourquoi ça ne passe pas. S'il vous plaît, excusez-moi pour vous déranger. J'apprécie tellement votre aide très précieuse.


Pouvez-vous fournir un exemple de oldfiles.txt


J'utilise ces fichiers vides pour la formation locale, ils sont enregistrés dans olffiles.txt sdafsdfs_jane.doc 12fgdf-jane.csv fichiers_jane.txt


Trouvé le problème dans le fichier il y a bien sûr la cheviche à la fin représentée avec \ N Ceci doit être dépouillé


Les noms de fichiers sont enregistrés le nom d'un fichier par ligne et non dans la même ligne indiquée dans le commentaire précédent. Merci beaucoup.


Les noms déjà dépouillés avant de remplacer la chaîne, donc je ne comprends pas d'où vient ?? Je ne sais pas comment le résoudre, j'ai été une semaine à la suite de ce sous-processus très gênant


dois-je ajouter cette ligne tr -d '\ n' ??


Je mettez déjà mis à jour ma mise à jour nom de fichier [: - 1] bandes le dernier caractère du nom de fichier .strip () ne dépasse pas les chevreakers. Alternativement, vous pouvez essayer .strip ('\ n')


Même si MV: ne peut pas stat '~ / sdafsdfs_jane.doc 12fgdf-jane.csv fichiers_jane.txt': Aucun fichier ou répertoire de ce type Je veux me saouler maintenant Plairement que cette évaluation est telle têtue. Pourrait être un bug de stdout?



0
votes

Merci à @ jonatà £ et @haklab pour leurs notes. Après plusieurs essais, j'ai résolu cette évaluation très gênante, mais j'ai appris beaucoup de choses, encore une fois, l'un des secrets du succès crucial est pratique strong>, voici le code final

#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r') as f:
    content1 = f.readlines()
    content2 = [x.strip() for x in content1]
    content3 = [item.replace("jane", "jdoe") for item in content2]
    res = dict(zip(content2, content3))
    for key, value in res.items():
        subprocess.run(['mv', '/home/ninja-coder/'+key, '/home/ninja-coder/'+value])


0 commentaires

1
votes

Votre premier code est plus simple et vous avez presque raison! La raison pour laquelle vous n'obtenez pas la sortie requise dans le premier code est parce que vous n'avez pas ajouté le chemin complet de la commande MV

#!/usr/bin/env python3
import sys
import subprocess
f= open (sys.argv[1],"r")
path='/home/<username>'
for line in f.readlines():
 old_name = line.strip()
 new_name = old_name.replace("jane","jdoe")
 subprocess.run(["mv",path+old_name,path+new_name])
f.close()


1 commentaires

S'il vous plaît upvote si vous trouvez ma question pertinente. Merci.