Comme l'a dit Jim, la syntaxe ___
signifie généralement tout ce qui est capturé par ce nom (___
) n'est pas utile, ou est garbage. Jetez un oeil à 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 quand 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 retournés par os.walk('test')
. Combien y a-t-il d'éléments dans 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 de 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épertoire dans quel dossier est désigné par le premier élément (donc .DS_Store est un fichier dans le répertoire test
).
Obtenons à votre boucle for
, alors (je ne vais pas utiliser les underscores encore):
>>> 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
Donc, la syntaxe for main_dir, sub_dirs, files in os.walk('test')
est vraiment ce que nous appelons « déballer ». Nous attribuons à main_dir
le premier élément dans os.walk('test')
, à sub_dirs
le deuxième élément, etc. La syntaxe ___
(qui devrait vraiment être juste _
), dit au lecteur, "Oubliez ces valeurs, j'ai nommé ceux 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. "
Merci, ai-je raison de penser que le [:] sur la ligne 2 est également redondant? – Notts90
@ Notts90 qui change' fichiers' sur place, je ne sais pas pourquoi l'auteur a décidé ils ont besoin de faire cela, donc je suis d'accord que, d'après ce que je peux voir, c'est redondant –
Une raison courante d'utiliser '__' au lieu de' _' est si vous utilisez gettext où '_' est généralement la fonction de traduction . –