# File Input/Output

File I/O que significa "input/output de arquivos" em inglês 🇺🇸, é uma funcionalidade essencial em Python para manipular dados armazenados💾 em arquivos. Em Python, você pode realizar operações de leitura (input) e escrita (output) em arquivos de maneira simples e eficiente.

File I/O serve para salvar os dados que gerou no seu programa. De outra forma, eles são apagados🗑️ uma vez que fecha o arquivo.

Suponha que você deseja verificar os alunos🎓 que foram numa atividade qualquer, e deseja salvar os nomes dos alunos num arquivo 📁.

```python
nomes = [] #uma lista vazia

# 10 alunos
for _ in range(10):
    nome = input("Nome: ").strip().title()
    nomes.append(nome)   #adiciona cada nome à lista 'nomes'
```

Ordenando e colocando dentro de funções👇:

```python
nomes = [] #uma lista vazia


def main():
    alunos(3)
    ordenar(nomes)
    
    
def alunos(quantidade):
    for _ in range(quantidade):
        nome = input("Nome: ").strip().title()
        nomes.append(nome)   #adiciona cada nome à lista 'nomes'

def ordenar(registro):
    for nome in sorted(registro):
        print(nome)


if __name__ == "__main__":
    main()
```

### Open()

Basicamente o 👉 [open()](https://docs.python.org/pt-br/3/library/functions.html#open) serve para abrir🔓 um arquivo, especificando o caminho do arquivo e o modo de operação. Após manipular o arquivo, é importante fechá-lo 🔒 usando o método `close()` . Os modos de operação são os seguintes:

* "r" -&gt; ler
    
* "a" -&gt; append ou adicionar
    
* "w" -&gt; escrever
    
* "b" -&gt; modo binário
    

O código a seguir irá criar um arquivo .txt onde será salvo 💾 essa informação.

```python
nome = input("Nome: ")
arquivo = open("meuarquivo.txt", "a")  #'a' para adicionar
arquivo.write(f"{nome}\n")  #\n pula para seguinte linha (enter)
arquivo.close()
```

Atualizando o código 👇:

```python
nomes = [] #uma lista vazia


def main():
    alunos(3)
    ordenar(nomes)
    
    
def alunos(quantidade):
    for _ in range(quantidade):
        nome = input("Nome: ")
        arquivo = open("meuarquivo.txt", "a")  #'a' para adicionar
        arquivo.write(f"{nome}\n")
        arquivo.close()

def ordenar(registro):
    for nome in sorted(registro):
        print(nome)


if __name__ == "__main__":
    main()
```

### With ()

O principal objetivo do `with ()` é garantir que determinadas operações de inicialização e finalização sejam realizadas de maneira limpa e eficiente. Se por acaso usou o `open()` e esqueceu de fechar com o `close()`, seu arquivo irá permanecer aberto, o uso do "with()" é uma sintaxe da seguinte forma 👇:

```python
with open("meuarquivo.txt", "a") as file:
    file.write(f"{nome}\n")  #grava  a informacao no meuarquivo.py
```

Atualizando o código 👇:

```python
nomes = [] #uma lista vazia


def main():
    alunos(3)
    ordenar(nomes)
    
    
def alunos(quantidade):
    for _ in range(quantidade):
        nome = input("Nome: ")
        with open("meuarquivo.txt", "a") as file:
            file.write(f"{nome}\n")  #grava  a informacao no meuarquivo.py           


def ordenar(registro):
    for nome in sorted(registro):
        print(nome)


if __name__ == "__main__":
    main()
```

Ao invés de gravar uma informação, eu quero ler 📖 a informação de um arquivo, para isso uso o parâmetro `.readlines()` da seguinte forma:

```python
with open("meuarquivo.txt", "r") as file:  #'r' read (ler)
    linhas = file.readlines()  #linhas é lista []

for linha in linhas:
    print("Aluno:", line.rstrip())  #rstrip() limpa os espaco à direita
```

Mas esse código pode ainda ser otimizado, trazendo o for para dentro do with, da seguinte forma 👇:

```python
with open("meuarquivo.txt") as file:
    for linha in file:
        print("Aluno", line.rstrip())
```

Existem infinitas possibilidades 🤷‍♂️ de tratamento de dados, por exemplo ordenar os nomes pelo alfabeto decrescente ⬆️ (baixo-cima) utilizando a função 👉 [sorted()](https://docs.python.org/pt-br/3/library/functions.html#sorted):

```python
with open("meuarquivo.txt") as file:
    for line in sorted(file, reverse=True):
        print("Aluno", line.rstrip())
```
