<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 List Comprehensions
Step1:  Observe que na linha acima aplicamos o método split diretamente a uma string, sem precisarmos nomear uma variável com o conteúdo da string!
Step2:  Como transformar todas as primeiras letras de cada item da lista em maiúsculas?
Step3:  Observe que x é uma variável local à list comprehension; ela serve apenas para que possamos fazer referência a cada item da lista sendo percorrida na nova expressão que queremos gerar. Fora da list comprehension, o Python não sabe quem é esse x
Step4:  Exemplo
Step5:  Para transformarmos essa lista em uma string, podemos usar o método join
Step6:  Uma explicação para a sintaxe do join
Step7:  Podemos, usando list comprehensions, gerar outras listas. Por exemplo, gerar uma lista de números ímpares
Step8:  Slicing
Podemos selecionar pedaços de uma lista (ou string) facilmente usando o conceito de slicing.
Step9:  Observe que, com um parâmetro a mais, podemos selecionar os elementos da lista de 2 em 2
Step10:  Também podemos calcular o tamanho de uma lista de números
Step11:  Podemos gerar uma nova lista contendo pedaços da lista original
Step12:  Infelizmente, o resultado acima é uma lista de listas
Step13:  Assim, para acessarmos um elemento individual da lista numeros, precisamos utilizar um índice para a lista externa, e outro índice para a lista interna
Step14:  Para transformarmos aquela lista de listas em uma lista simples, podemos usar o comando abaixo (admito que é um pouco mágico, mas funciona! ;))
Step15:  Observe que o slicing também vale para sequências de caracteres (strings)
Step16:  Comandos de repetição e condicionais
Repetição
Step17:  Fazemos isso explicitamente quando usamos a estrutura for. Observe que, no Python, não precisamos sinalizar o fim de um bloco de código; na verdade, a indentação sinaliza um bloco. Observe a diferença entre as células abaixo
Step18:  Condicionais
Step19:  Usamos == na expressão acima, pois no Python é necessário diferenciar entre um comando de atribuição (atribuir um valor a uma variável) e um comando de comparação (testar se duas variáveis são iguais). O caso do if é o segundo.
Podemos também acrescentar outras condições lógicas ao nosso teste.
Step20:  Scripting
Exemplo 1
Percorrer um diretório com diversos arquivos e procurar todos os arquivos que satisfazem algum critério, realizando alguma operação nesses arquivos.
Para acessarmos comandos e operações realizadas no nível do sistema operacional, utilizamos o módulo os.
Step21:  Atenção
Step22:  Em seguida, vamos listar todos os arquivos deste diretório.
Step23:  Para que possamos percorrer a lista que contém os nomes de todos os arquivos deste diretório, vamos salvar esta lista de nomes de arquivo
Step24:  Agora, vamos efetuar a seguinte operação
Step25:  Verificando que funcionou
Step26:  (é claro que se você estiver em um diretório em que não hajam arquivos com extensão ".txt", nada irá acontecer!)
Para desfazermos este exemplo, podemos executar o seguinte script
Step27:  Exemplo 2
Organizar os arquivos de um diretório pela data da última modificação.
Step28:  Agora, para descobrirmos quando o arquivo foi modificado pela última vez, precisamos usar uma função que não retorna a data da última modificação no formato em que estamos acostumados. Ela retorna o tempo, em segundos, decorrido desde 1o de janeiro de 1970 (se você estiver no Unix). Para podermos obter o que queremos, usamos então a função ctime do módulo time.
Step29:  Agora, vamos desfazer o exercício para restaurarmos o diretório à estrutura original
<ASSISTANT_TASK:>
Python Code:
minhalista = "Como fazer uma list comprehension".split()
Explanation: List Comprehensions
End of explanation
minhalista
Explanation: Observe que na linha acima aplicamos o método split diretamente a uma string, sem precisarmos nomear uma variável com o conteúdo da string!
End of explanation
minhalista = [x.capitalize() for x in minhalista]
minhalista
Explanation: Como transformar todas as primeiras letras de cada item da lista em maiúsculas?
End of explanation
x
Explanation: Observe que x é uma variável local à list comprehension; ela serve apenas para que possamos fazer referência a cada item da lista sendo percorrida na nova expressão que queremos gerar. Fora da list comprehension, o Python não sabe quem é esse x:
End of explanation
linguadope = ["Pe"+palavra for palavra in minhalista]
linguadope
Explanation: Exemplo: língua do P
End of explanation
" ".join(linguadope)
Explanation: Para transformarmos essa lista em uma string, podemos usar o método join:
End of explanation
numeros = [n for n in range(0,10)]
print(numeros)
Explanation: Uma explicação para a sintaxe do join: http://www.faqs.org/docs/diveintopython/odbchelper_join.html (basicamente, o método join precisa de duas strings: um resultado e uma "cola". Mas o argumento a ser unido pode ser outra coisa além de uma string (notadamente, iterables)
Exemplo: lista de números
É comum querermos gerar uma lista de números delimitada por dois valores. A função range(a,b) gera uma lista que vai do número a até b-1; porém, o resultado da função range não é a lista diretamente, mas uma estrutura de dados que precisamos transformar em uma lista.
End of explanation
numeros = [2*n+1 for n in range(0,11)]
numeros
Explanation: Podemos, usando list comprehensions, gerar outras listas. Por exemplo, gerar uma lista de números ímpares:
End of explanation
numeros[0]
numeros[-1]
numeros[3:4]
Explanation: Slicing
Podemos selecionar pedaços de uma lista (ou string) facilmente usando o conceito de slicing.
End of explanation
numeros[0:11:2]
Explanation: Observe que, com um parâmetro a mais, podemos selecionar os elementos da lista de 2 em 2:
End of explanation
len(numeros)
numeros[-3]
Explanation: Também podemos calcular o tamanho de uma lista de números:
End of explanation
numeros = [numeros[4:6],numeros[3:8]]
print(numeros)
Explanation: Podemos gerar uma nova lista contendo pedaços da lista original:
End of explanation
numeros[0]
Explanation: Infelizmente, o resultado acima é uma lista de listas: cada elemento da lista é, por sua vez, uma outra lista:
End of explanation
numeros[0][1]
Explanation: Assim, para acessarmos um elemento individual da lista numeros, precisamos utilizar um índice para a lista externa, e outro índice para a lista interna:
End of explanation
lista = [item for sublist in numeros for item in sublist]
lista
Explanation: Para transformarmos aquela lista de listas em uma lista simples, podemos usar o comando abaixo (admito que é um pouco mágico, mas funciona! ;))
End of explanation
palavra = "teste"
palavra[1:]
Explanation: Observe que o slicing também vale para sequências de caracteres (strings):
End of explanation
numeros = [n for n in range(0,11)]
print(numeros)
Explanation: Comandos de repetição e condicionais
Repetição: for
Às vezes, desejamos repetir um certo número de vezes a mesma operação.
De fato, uma lista comprehension inclui um comando de repetição: executamos alguma ação com cada item de uma lista; se lermos a expressão da lista comprehension, poderíamos dizer: "retorne n para cada n no conjunto que vai de 0 a 10":
End of explanation
for item in numeros: # Indentação
    print("Numero "+str(item))
print("bla")
for item in numeros: # Indentação
    print("Numero "+str(item))
    print("bla")
Explanation: Fazemos isso explicitamente quando usamos a estrutura for. Observe que, no Python, não precisamos sinalizar o fim de um bloco de código; na verdade, a indentação sinaliza um bloco. Observe a diferença entre as células abaixo:
End of explanation
palavra = "bla"
if palavra == "bla!":
    print("Verdadeiro")
else:
    print("Falso")
Explanation: Condicionais: if
Agora, se desejamos realizar uma operação caso alguma condição seja satisfeita, e outra caso contrário, usamos a estrutura if: "se determinada condição lógica for verdadeira, execute o primeiro bloco de comandos; caso contrário (else), execute o segundo".
End of explanation
if palavra == "bla!" and 3 > 2:
    print("Aha")
else:
    print("Uhu")
if palavra == "bla!" or 3>2:
    print("Aha")
else:
    print("Uhu")
Explanation: Usamos == na expressão acima, pois no Python é necessário diferenciar entre um comando de atribuição (atribuir um valor a uma variável) e um comando de comparação (testar se duas variáveis são iguais). O caso do if é o segundo.
Podemos também acrescentar outras condições lógicas ao nosso teste.
End of explanation
import os
Explanation: Scripting
Exemplo 1
Percorrer um diretório com diversos arquivos e procurar todos os arquivos que satisfazem algum critério, realizando alguma operação nesses arquivos.
Para acessarmos comandos e operações realizadas no nível do sistema operacional, utilizamos o módulo os.
End of explanation
diretorio = os.path.join(os.getcwd(), "..","exemplos/exemplo_1")
Explanation: Atenção: Escolha um diretório no seu computador para executar esse exemplo, com arquivos que possam ser renomeados.
No meu caso, usarei os arquivos do diretório oceanobiopython/exemplos/exemplo_1
End of explanation
os.listdir(diretorio)
Explanation: Em seguida, vamos listar todos os arquivos deste diretório.
End of explanation
lista = os.listdir(diretorio)
Explanation: Para que possamos percorrer a lista que contém os nomes de todos os arquivos deste diretório, vamos salvar esta lista de nomes de arquivo:
End of explanation
for arquivo in lista:
    if arquivo[-3:] == "txt":
        os.rename(os.path.join(diretorio,arquivo),os.path.join(diretorio,arquivo.capitalize()))
Explanation: Agora, vamos efetuar a seguinte operação: todos os arquivos deste diretório que tiverem a extensão ".txt" terão um novo nome iniciando com letra maiúscula.
End of explanation
os.listdir(diretorio)
Explanation: Verificando que funcionou:
End of explanation
lista = os.listdir(diretorio)
for arquivo in lista:
    os.rename(os.path.join(diretorio,arquivo),os.path.join(diretorio,arquivo.lower()))    
os.listdir(diretorio)
Explanation: (é claro que se você estiver em um diretório em que não hajam arquivos com extensão ".txt", nada irá acontecer!)
Para desfazermos este exemplo, podemos executar o seguinte script:
End of explanation
import os
diretorio = os.path.join(os.getcwd(), "..","exemplos/exemplo_2")
print(diretorio)
print(os.listdir(diretorio))
Explanation: Exemplo 2
Organizar os arquivos de um diretório pela data da última modificação.
End of explanation
import time
print(os.path.getmtime(os.path.join(diretorio,"file1.txt")))
time.ctime(os.path.getmtime(os.path.join(diretorio,"file1.txt")))
lista = os.listdir(diretorio)
for arquivo in lista:
    print(time.ctime(os.path.getmtime(os.path.join(diretorio,arquivo))))
os.mkdir(os.path.join(diretorio,"arquivos_setembro"))
os.mkdir(os.path.join(diretorio,"arquivos_agosto"))
for arquivo in lista:
    if arquivo != "teste.txt":
        data_modificacao = time.ctime(os.path.getmtime(os.path.join(diretorio,arquivo)))
        if data_modificacao[4:7] == "Sep":
            os.rename(os.path.join(diretorio,arquivo), os.path.join(diretorio,"arquivos_setembro",arquivo))
        elif data_modificacao[4:7] == "Aug":
            os.rename(os.path.join(diretorio,arquivo), os.path.join(diretorio,"arquivos_agosto",arquivo))
Explanation: Agora, para descobrirmos quando o arquivo foi modificado pela última vez, precisamos usar uma função que não retorna a data da última modificação no formato em que estamos acostumados. Ela retorna o tempo, em segundos, decorrido desde 1o de janeiro de 1970 (se você estiver no Unix). Para podermos obter o que queremos, usamos então a função ctime do módulo time.
End of explanation
lista = os.listdir(diretorio)
for item in lista:
    if os.path.isdir(os.path.join(diretorio,item)):
        locais = os.listdir(os.path.join(diretorio,item))
        print(locais)
        for arquivo in locais:
            os.rename(os.path.join(diretorio,item,arquivo),os.path.join(diretorio,arquivo))
        os.rmdir(os.path.join(diretorio,item))
print(os.listdir(diretorio))
Explanation: Agora, vamos desfazer o exercício para restaurarmos o diretório à estrutura original:
End of explanation
<END_TASK>