Comme l'a dit Jim, le ___
signifie généralement tout ce qui est capturé par ce nom ( ___
) n'est pas utile ou est un déchet. Prenons l'exemple suivant, par souci d'exhaustivité :
J'ai un dossier, test
avec la structure suivante :
test
subtest1
file1.txt
file2.txt
subtest2
file3.txt
Regardez ce qui se passe lorsque j'utilise os.walk
sur test
:
>>> list(os.walk('test'))
[('test', ['subtest1', 'subtest2'], ['.DS_Store']), ('test/subtest1', [], ['file1.txt', 'file2.txt']), ('test/subtest2', [], ['file3.txt'])]
>>> len(list(os.walk('test')))
3
Il y a donc techniquement trois éléments dans le générateur renvoyé par os.walk('test')
. Combien y a-t-il d'éléments à l'intérieur de chaque élément, puisque nous voyons clairement des structures de données imbriquées ?
>>> [len(x) for x in os.walk('test')]
[3, 3, 3]
D'accord, il y a trois sous-éléments dans chaque élément de os.walk('test')
. Par exemple, à list(os.walk('test'))[0]
, il y a 'test'
(le premier élément), ['subtest1', 'subtest2']
(le deuxième élément), et ['.DS_Store']
(le troisième et dernier élément). Le dernier élément contient les fichiers non répertoriés dans le dossier désigné par le premier élément (ainsi, .DS_Store est un fichier dans le dossier test
).
Venons-en à votre for
alors (je n'utiliserai pas encore les underscores) :
>>> for main_dir, sub_dirs, files in os.walk('test'):
... print("Main directory: ", main_dir)
... print("Sub-directories: ", ', '.join(sub_dirs))
... print("Files: ", ', '.join(files))
...
Main directory: test
Sub-directories: subtest1, subtest2
Files: .DS_Store
Main directory: test/subtest1
Sub-directories:
Files: file1.txt, file2.txt
Main directory: test/subtest2
Sub-directories:
Files: file3.txt
Ainsi, le for main_dir, sub_dirs, files in os.walk('test')
La syntaxe est en fait ce que l'on appelle le "déballage". Nous assignons à main_dir
le premier élément de os.walk('test')
, à sub_dirs
le deuxième élément, etc. Le ___
(qui devrait être simplement _
), dit au lecteur : "Oubliez ces valeurs ; j'ai nommé celles dont j'ai besoin". Dans votre cas, le code dit : "Oubliez les répertoires d'où proviennent ces fichiers ; je veux juste les noms de fichiers eux-mêmes".