web-dev-qa-db-fra.com

Python: rechercher un fichier dans le répertoire courant et tous ses parents

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?

7
gaganso

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
5
Harwee

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

1
Kylar

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()   
1
sparrow

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)
0
Jamieson Becker

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)
0
Kjeld Flarup

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').

0
Ic3fr0g