Existe-t-il un module intégré permettant de rechercher un fichier dans le répertoire actuel, ainsi que tous les super-répertoires?
Sans le module, je devrai lister tous les fichiers du répertoire en cours, rechercher le fichier en question et le déplacer récursivement si le fichier n'est pas présent. Y a-t-il un moyen plus facile de faire cela?
Eh bien, ce n'est pas si bien mis en œuvre, mais cela fonctionnera
utilisez listdir
pour obtenir la liste des fichiers/dossiers du répertoire en cours, puis recherchez-le dans la liste.
Si elle existe, la boucle est interrompue mais dans le cas contraire, elle passe dans le répertoire parent à l'aide de os.path.dirname
et listdir
.
si cur_dir == '/'
le répertoire parent pour "/"
est retourné sous la forme "/"
donc si cur_dir == parent_dir
il coupe la boucle
import os
import os.path
file_name = "test.txt" #file to be searched
cur_dir = os.getcwd() # Dir from where search starts can be replaced with any path
while True:
file_list = os.listdir(cur_dir)
parent_dir = os.path.dirname(cur_dir)
if file_name in file_list:
print "File Exists in: ", cur_dir
break
else:
if cur_dir == parent_dir: #if dir is root dir
print "File not found"
break
else:
cur_dir = parent_dir
import glob
et utilisez glob.glob('your_pattern_or_name_of_file')
Vous pouvez voir la documentation sur glob ici____ https://docs.python.org/2/library/glob.html
Voici un exemple qui trouvera tous les fichiers .csv dans un répertoire spécifié "path" et tous ses répertoires racine et les imprimera:
import os
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(".csv"):
path_file = os.path.join(root,file)
print(path_file)
Si vous voulez commencer par un répertoire et vous frayer un chemin chez les parents, cela fonctionnera pour trouver tous les fichiers .csv (par exemple):
import os
import glob
last_dir = ''
dir = r'c:\temp\starting_dir'
os.chdir(dir)
while last_dir != dir:
dir = os.getcwd()
print(glob.glob('*.csv'))
os.chdir('..')
last_dir = os.getcwd()
La question parent était de marcher dans les répertoires parent (ne pas descendre dans les enfants comme la commande find
):
# walk PARENT directories looking for `filename`:
f = 'filename'
d = os.getcwd()
while d != "/" and f not in os.listdir(d):
d = os.path.abspath(d + "/../")
if os.path.isfile(os.path.join(d,f)):
do_something(f)
Voici une version qui utilise la globalisation du shell pour faire correspondre plusieurs fichiers:
# walk PARENT directories looking for any *.csv files,
# stopping when a directory that contains any:
f = '*.csv'
d = os.getcwd()
while d != "/" and not glob.glob(os.path.join(d, f)):
d = os.path.abspath(d + "/../")
files = glob.glob(os.path.join(d,f))
for filename in files:
do_something(filename)
Je viens d'écrire ceci pour trouver le répertoire "images", notez '/' est du style Linux
dir = os.getcwd()
while dir != '/' and not glob.glob( dir + '/images' ):
dir = os.path.dirname(dir)
Je dirais que vous pouvez utiliser glob.glob()
pour rechercher tous les fichiers que vous recherchez. Le module glob trouve tous les noms de chemins correspondant à un modèle spécifié conformément aux règles utilisées par le shell Unix, bien que les résultats soient renvoyés dans un ordre arbitraire. . De la docs -
glob.glob (chemin, *, récursif = False)
Renvoie une liste éventuellement-vide des noms de chemin qui correspondent à chemin, qui doit être une chaîne contenant un spécification de chemin. Le chemin peut être soit absolu (comme /usr/src/Python-1.5/Makefile) ou relatif (comme ../../Tools/*/*.gif), et peut contenir des caractères génériques de style shell. Les liens symboliques rompus sont inclus dans les résultats (comme dans le shell).
Notre objectif est de rechercher tous les fichiers texte d’un répertoire, de ses sous-répertoires et de son répertoire parent. Utilisez os.walk()
ou os.chdir()
pour vous rendre au répertoire avec lequel vous souhaitez travailler. Je suis donc allé dans mon répertoire de travail actuel et à partir de là j'ai pu accéder à TOUS LES FICHIERS TEXTE avec cet extrait de code -
import glob
arr=glob.glob('*\*\*.txt')
'''....thesis/tweets is the path I walked to which
has further sub directories, tweets\LDA on tweets\test file for main reults ,
tweets\LDA on tweets\paris_Tweet ,tweets\LDA on tweets\hurricane_patricia\ '''
count=0
for filename in arr:
print (filename)
count+=1
print("ran successfulyy!!!! count = ",count)
Je reçois tous les fichiers texte (54) de tous les sous-répertoires. Cette sortie montre seulement quelques -
LDA on tweets\paris_Tweet\ldaparisresults.txt
LDA on tweets\paris_Tweet\ldaparisresults1.txt
LDA on tweets\hurricane_patricia\80,xldahurricaneresults.txt
LDA on tweets\hurricane_patricia\entitieshurricane.txt
LDA on tweets\test file for main reults\80,10ldamainresults.txt
LDA on tweets\test file for main reults\80,30ldamainresults.txt
Pour obtenir des fichiers texte du répertoire parent (et de ses sous-répertoires immédiats), remplacez-le simplement par arr=glob.glob('..\*\*.txt')
.