O objetivo é navegar nas pastas através do modulo os
import os
def listArchives(url):
return os.listdir(url)
def showArchives(ArchivesList):
for enum,archive in enumerate(ArchivesList, start=1):
print(f'{enum}-{archive}')
def selectArchives(ArchivesList, option,URL):
for enum, archive in enumerate(ArchivesList, start=1):
if option == enum:
URL=os.path.join(URL, archive)
ArchivesList = listArchives(URL)
URL = 'c:\\'
ArchivesList = os.listdir(URL)
while True:
showArchives(os.listdir(URL))
option = int(input('dir: '))
selectArchives(ArchivesList,option,URL)
o problema é que mesmo eu tentando alterar o valor URL e o ArchivesList, é como se eu estivesse reescrevendo a variável que recebi como argumento dentro da função, logo ela não existe fora dela, se eu tentar chamar ela sem passar como argumento ele não reconhece a variável.
Então, se o seu código estiver exatamente igual o postado, acredito que é erro de formatação, um simples “TAB” com as ultimas 3 linhas selecionadas.
mude isso:
while True:
showArchives(os.listdir(URL))
option = int(input('dir: '))
selectArchives(ArchivesList,option,URL)
Para isso:
while True:
showArchives(os.listdir(URL))
option = int(input('dir: '))
selectArchives(ArchivesList,option,URL)
como não tem chaves [’{’,’}’] para delimitar os blocos isto é feito por “TAB” ou seja, pra estar dentro do bloco do “WHILE” o codigo tem que estar a 1 tab depois dele.
Se vc colocar na mesma linha vertical é como se a próxima linha fosse executada fora do WHILE.
tlgd, o código original está formatado corretamente, é que isso ai é um ctrl+z. O problema era na hora de manipular as variáveis globais, ele simplesmente criava uma nova variavel com o mesmo nome. Solucionei clocando global
nas variáveis que queria mudar.
Não acho uma boa usar variáveis globais, pois aí as funções ficam dependentes demais delas (leia mais sobre isso aqui). Eu sugiro fazer com que a função retorne o valor da variável atualizado, algo assim:
import os
def listArchives(url):
return os.listdir(url)
def showArchives(arquivos):
for enum, archive in enumerate(arquivos, start=1):
print(f'{enum}-{archive}')
def selectArchives(arquivos, option, pasta_atual):
# retorna a nova pasta
return os.path.join(pasta_atual, arquivos[option])
pasta_atual = 'c:\\'
while True:
arquivos = listArchives(pasta_atual)
showArchives(arquivos)
option = int(input('dir: '))
pasta_atual = selectArchives(arquivos, option - 1, pasta_atual)
Também mudei os nomes de algumas variáveis, e veja que o selectArchives
não precisa fazer um loop. Listas possuem índices numéricos que podem ser acessados diretamente, então basta acessá-lo.
Claro que tem algumas melhorias: se for digitada uma opção inválida (não é número, ou é um número que não existe - por exemplo, digitei “20” sendo que só tem 10 arquivos), ou se o usuário escolher um arquivo em vez de um diretório, dará erro. Mas aí já é outra história…