Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Modo de leitura com o +

Se eu inserir o modo de leitura 'w+' ou 'a+' no código, não apresenta erro, mas não aparece nada também, por que?

try:
    with open('dados/contatos.csv', encoding='latin_1') as arquivo_contatos:
        for linha in arquivo_contatos:
            print(linha, end='')
except FileNotFoundError:
    print('Arquivo não encontrado')
except PermissionError:
    print('Sem permissão de escrita')
3 respostas

w+ e a+ são modos de escrita no arquivo... Pelo que entendi esse seu exemplo tenta ler o arquivo, não?

O print como está vai apenas imprimir a linha lida do arquivo na tela. Se o arquivo é aberto para escrita, acho que não se lê nada ...

Pelo que eu tinha entendido, quando se coloca o modo 'w' ou 'a' com o +, seria habilitado a possibilidade de leitura ou escrita.

solução!

Oi pessoal, tudo bem?

Maico, é exatamente isso. Quando abrimos em modo 'w+' ou 'a+', abrimos o arquivo para leitura e escrita. Porém, vale algumas anotações:

  • Em w+: Abre para leitura e escrita. O arquivo é criado se ele não existir, caso contrário será sobrescrito. O ponteiro é posicionado no início do arquivo.

Quando fazemos:

 with open('dados/contatos.csv', mode='w+', encoding='latin_1') as arquivo_contatos:

Como o arquivo existe, ele será sobrescrito, entenda como apagar o que há no arquivo para escrever novos caracteres. Logo, como você está tentando ler o que nele, porém o mesmo foi sobrescrito, não terá nada para ler. Ficará um arquivo em branco. Por isso não aparece nada.

  • Em a+: Abre para leitura e escrita. O arquivo é criado se ele não existir. O ponteiro é posicionado no final do arquivo. Gravações subsequentes no arquivo sempre vão acabar no fim do arquivo atual.

Quando fazemos:

 with open('dados/contatos.csv', mode='a+', encoding='latin_1') as arquivo_contatos:

O ponteiro será posicionado no final do arquivo, pois o modo a é para anexar caracteres ao arquivo sem apagar o conteúdo que já existe nele e quando colocamos o "+" isso não muda, o ponteiro continuará no final do arquivo:

image

Como o cursor está posicionado no final do arquivo, concorda que não terá dado algum para ler? Então, quando formos efetuar a leitura do arquivo, teremos que dizer para o Python que queremos que o cursor esteja no início e fazemos isso com o seek, passando como parâmetro o número 0. Ou seja, o cursor será posicionado na primeira letra do arquivo:

image

Agora, com o cursor posicionado na primeira letra do arquivo conseguiremos ler os dados que há para frente:

 with open('dados/contatos.csv', mode='a+', encoding='latin_1') as arquivo_contatos:
        arquivo_contatos.seek(0)
        for linha in arquivo_contatos:
            print(linha, end='')

Pegou a ideia?

Qualquer dúvida é só falar, estou a disposição. Abraços e bons estudos!