Boa noite pessoal!
Seguindo algumas sugestões, hoje vamos falar de um tema que acidentalmente foi esquecido por aqui: Manipulação de arquivos!
Veremos aqui as formas mais simples (e frequentes) de ler e escrever em arquivos.
Comece criando um arquivo txt com algum texto dentro, especialmente se este tiver ao menos umas 10 linhas.
Usaremos arquivos de texto por serem os mais simples, mas estes métodos servem para qualquer tipo de arquivo.
Como exemplo aqui pegarei uma letra de música:
Well you done done me and you bet I felt it
I tried to be chill but you're so hot that I melted
I fell right through the cracks, now I'm trying to get back
Before the cool done run out I'll be giving it my bestest
And nothing's going to stop me but divine intervention
I reckon it's again my turn to win some or learn some
But I won't hesitate no more, no more
It cannot wait, I'm yours
Well open up your mind and see like me
Open up your plans and damn you're free
Chamei o arquivo de musica.txt.
agora, no terminal vá até o diretório onde está seu arquivo e abra o interpretador Python.
Abra o arquivo com o comando:
>>> arquivo = open('musica.txt', 'r')
Agora você terá um objeto file na variável arquivo. Observe que o parâmetro 'r' indica que está abrindo o arquivo somente para leitura.
Execute então o seguinte comando:
>>> arquivo.read()
Você verá que foi retornado todo o conteúdo do arquivo em uma só string.
Leia novamente o arquivo:
>>> arquivo = open('musica.txt', 'r')
Execute o comando:
>>> arquivo. readlines()
Agora, o arquivo soi lido totalmente, porém desta vez como uma lista de strings, com uma string para cada linha.
Leia o arquivo mais uma vez:
>>> arquivo = open('musica.txt', 'r')
Execute:
>>> arquivo.readline()
Seu retorno desta vez é somente a primeira linha do arquivo.
Executando novamente, você receberá a segunda linha e assim por diante.
Experimente:
>>> arquivo.readline()
Cada um destes métodos pode receber parâmetros, mas o artigo se alongaria demasiadamente se fosse explicar cada possibilidade. Os comandos feitos assim já são suficientes para suprir uma grande parte da necessidade que você pode encontrar de leitura de arquivos.
Agora veremos as duas possibilidades de escrita em arquivos.
Feche o arquio e leia novamente o arquivo:
>>> arquivo.close()
>>> arquivo = open('musica.txt', 'w')
Note que desta vez trocamos o 'r' por 'w', pois iremos abrir o arquivo para escrita.
Execute:
>>> arquivo.write('Qualquer coisa')
>>> arquivo.close()
Todo o conteúdo do seu arquivo será substituido por 'Qualquer coisa'. Para a alteração acontecer, às vezes é imprescindível fechar o arquivo, então, devemos sempre fazer isto para garantir.
Caso você não queira sobrescrever o conteúdo, mas adicionar, deve ler o conteúdo para uma variável, adicionar a nova string e somente então escrever. Assim:
>>> arquivo = open('musica.txt', 'r')
>>> texto = arquivo.readlines()
>>> texto.append('Nova linha')
>>> arquivo = open('musica.txt', 'w')
>>> arquivo.writelines(texto)
>>> arquivo.close()
Neste bloco, abrimos o arquivo para leitura, salvamos seu conteúdo como uma lista de strings dentro de uma variável, adicionamos uma nova string a esta lista e então escrevemos a lista no arquivo.
Escrita e leitura de arquivos é uma das tarefas mais importantes a se realizar com uma linguagem de programação, então brinque bastante, perceba as nuances e use os comandos dir() e help() para entender melhor os métodos e objetos envolvidos.
Espero que tenham gostado de ver como é simples e direta a manipulação de arquivos em Python!
Dúvidas e sugestões por email ou nos comentários!
Muito obrigado, e até a próxima!

Muito bom artigo, bem explicativo e intuitivo.
ResponderExcluirParabéns Julio Cesar!
Muito obrigado!
ExcluirE obrigado também pela colaboração com sugestões!
Abraço!
Olá , Julio Cesar!
ResponderExcluirSou aluno da UFF e estou com um problema para programar um algoritmo no Python. Meu professor de Iniciação Científica me pediu para fazer um algoritmo sobre a razão sinal-ruido de um conjunto de dados, ja pesquisei bastante e consegui isso:
o ruido gerado pelo np.random.normal ja eh aleatorio
a media eh zero se loc=0.0
o "tamanho" do ruido eh dada pelo scale, experimente scale=0.1
e o numero de pontos eh o size, no seu caso size= 4050
>>> loc, scale = 0, 0.1
>>> s = np.random.normal(loc, scale, 4050)
some s ao y do dado de entrada
repita para scale=1 e scale=10
plote os tres decaimentos (pares xy) com diferentes niveis de ruido
O que mais devo fazer?
Obrigado ,
Leonardo
Olá Leonardo, desculpe a demora em responder.
ExcluirComo não conheço o domínio do problema, você falar em loc, scale e s fica um bocado superficial, além disso não sei o que vc precisa fazer.
O que vc colocou aqui você consegue fazer facilmente com python seguindo as informações que há aqui no blog.
Quanto a plotar os resultados, eu indico a biblioteca Matplotlib.
Espero ter ajudado.
Boa Noite, Julio Cesar.
ResponderExcluirPrimeiramente, parabéns pelo artigo, simples e bom.
Estou iniciando em programação e gostaria de saber se poderia me ajudar com uma dúvida.
Eu preciso que o programa me peça para entrar com um conjunto de dados, mas não sei ao certo se faço isso manipulando arquivos ou pelo input.
Já tentei várias vezes, mas o programa não lê. Não sei onde estou errando.
Desde já agradeço!
Olá! Bom, quando tentou ler o arquivo deu algum erro ou simplesmente não leu?
ExcluirEntra em contato por email que fica mais fácil de te ajudar. Pose ser com mensagem pela área de contato aqui do blog mesmo.
Espero poder te ajudar!
Abraço!
Bom, o problema é que não consigo acessar os dados do arquivo:
ResponderExcluir>>>arq=open("arquivo.txt","r")
>>>x=arq.readlines()
>>>x
[]
Meu objetivo é que ele retorne uma lista com os dados para a variável x.
Já tentei o arq.seek, mas não funciona.
Um abraço!
Bom se o arquivo arquivo.txt estiver no mesmo diretório em que vc rodou o programa, ou se fez um chdir() para o local onde se encontra o arquivo, deveria ter funcionado.
ResponderExcluirBoa Tarde, Julio Cesar.
ResponderExcluirMeu professor passou um projeto agenda, para salvar os dados em arquivo, só que n sou muito bom em arquivos, estou tendo dificuldade para procurar o nome e os outros dados dentro do arquivo. eu quero que ele faça uma busca dentro do arquivo.txt e encontre o nome especifico e dps imprima oq encontrou..
Eu coloquei para salvar o arquivo em uma lista de uma olhada nesse codigo e se puder me ajudar, eu agradeço ^^.
# adicionar
nome = [] # nome
CPF = [] # CPF
name = raw_input("Nome Completo: ")
adicionar = open("lista.txt","ab")
addtime = time.asctime( time.localtime(time.time()))
nome.append(name)
adicionar.writelines("Nome: "+ str(nome) +" | Adicionado em: "+addtime+ " | \r\n")
cp = raw_input("CPF/CNPJ: ")
CPF.append(cp)
adicionar.writelines("CPF: "+ str(CPF)+"\r\n")
# buscar
Auxilia = False
buscar = open("lista.txt","rb") #Abre o arquivo modo leitura
try:
pro = buscar.read()
nombre = raw_input("Informe seu nome: ")
find = nombre
for i in pro:
if nombre in i:
Auxilia = True
break
except IndexError:
print('\n')
print ('====== Nome Invalido ! =========')
print('\n')
enter = raw_input('(Pressione ENTER para continuar)')
else:
if Auxilia == True:
print('\n')
print ("Seu Nome: "),nome
print ("CPF: "),CPF
print ("Rua: "),Ende
print ("Bairro: "),Aveni
print ("Numero: "),num
print('\n')
enter = raw_input('(Pressione ENTER para continuar)')
buscar.close()
Olá!
ExcluirBom, vejamos o que pode ser melhorado ou consertado aqui...
Primeiro, você está abrindo o arquivo como binário (o b na flag de leitura open('arquivo', '[]b') se você está trabalhando com strings, não use o b.
quando for ler o arquivo pra fazer a busca, use readlines() no lugar de read().
Assim você pode procurar nas linhas do arquivo se existe a string que você quer encontrar.
Espero que tenha te ajudado!
Qualquer coisa mande mais comentários ou mensagem direto pra mim pela página de contatos!
Abraço!
É importante lembrar que a recomendação oficial é abrir arquivos dentro de um context manager usando o with. Esse artigo que escrevi há algum tempo fala sobre isso: http://aprenda-python.blogspot.com.br/2010/09/garanta-o-fechamento-dos-arquivos.html
ResponderExcluirLink para a documentação oficial que fala sobre a boa prática de usar o with: http://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files (o texto está 2 parágrafos antes de começar a seção sobre o Pickle).
Vale ressaltar que meu intuito não é tratar de todas as variações do Python, sendo o conteudo aqui bastante voltado para o Python em C, e especialmente nas versões 2.X.
ExcluirAcho que no fim das contas, o mais relevante, neste contexto, do uso do with é evitar gerar lixo em caso de quebra antes do fechamento do arquivo.
Muito obrigado pelo comentário! É realmente muito relevante a observação!
Boa noite Julio, preciso tirar algumas duvidas, seguinte, tenho um arquivo com a seguinte estrutura:
ResponderExcluirteste@teste.com.br;1010
fulano@gmail.com.br;1020
ciclano@hotmail.com;1030
preciso ler o arquivo q contem as informações supracitadas e editar o arquivo no qual tenho como resultado a seguinte estrutura:
enter input;login_email teste@teste.com.br
enter input;login_password 1010
click input;submit.x
enter input;login_email fulano@gmail.com.br
enter input;login_password 1020
click input;submit.x
enter input;login_email ciclano@hotmail.com
enter input;login_password 1030
click input;submit.x
entendeu? Não estou conseguindo chegar a tal resultado.
Olá Diogo!
ExcluirNa verdade pra te ajudar tenho que saber o que foi que você já fez!
Pode entrar em contato por email que fica mais fácil!
Abraço!
poxa espero que possam me ajudar estou iniciando com programação e escolhi o Python estou seguindo a apostila aprenda a programar da Python Brasil e empaquei no seguente problema na hora de executar o 'arquivo.py' pelo prompt do Windows meu Windows é o "SEVEN" ele simplesmente não executa faço tudo direito abro o prompt vou até aonde esta o arquivo.py que desejo abrir e invoco o comando para abrir o arquivo com o Python (..\Python egotrip.py)
ResponderExcluirno caso então a linha toda ficaria assim,
(C:\PythonXX\Curso>..\Python egotrip.py) mais quando do enter para executar o comando e rodar o arquivo simplesmente não roda a versão do meu Python é a 3.3.2 acho que é a mais nova se puderem me ajudar por favor porque para eu poder avançar nos estudos tenho que saber fazer isso obrigado desde já!!
Olá! Pra te ajudar preciso de mais informações.
ResponderExcluirNão conheço esta apostila, então tenho que saber primeiro qual a versão sobre a qual a apostila trata.
Tenho que saber também qual a mensagem que aparece quando você tenta executar o arquivo...
Espero conseguir te ajudar melhor. Abraços!
bom obrigado por tentar me ajudar Julio é o seguinte essa apostila tem online no site da Python Brasil nome dela é (Aprenda a programar Luciano Ramalho)mais no site da Python Brasil esta "Aprenda a programar Python Brasil"; bom a parte que eu estou na apostila é o capitulo 3 "ASCII art", nessa parte do ASCII art que esta pedindo para fazer isso no DOS e estou empacado eu tenho imagens de como é, eu tirei pelo Corel capture mais já posso te adiantar que não aparece nada depois que executo o comando para invocar o programa simplesmente volta para o diretório q estava antes de invocar o comando. fica assim :
ResponderExcluirantes de invocar o programa ->(C:\python33\Curso>)
depois de invocar o programa ->(C:\python33\Curso>..\python egtrip.py
C:\python33\Curso>)
Ok, as coisas melhoram um pouco com estas informações.
ResponderExcluirNão acho que consigo olhar esta apostila hoje, mas amanhã dou uma olhada nela pra entender melhor.
Quanto à execução do programa, geralmente quando não mostra nada é porque ele foi executado.
Talvez esteja entrando em algum if e saindo antes do que você esperava.
Uma dica que te dou é olhar este script egtrip linha por linha pra tentar achar porque ele não faz o que você espera. Tenta seguir ele da forma como aconteceria na sua máquina.
Espero que isto te ajude!
Abraço!
ta bom. eu posso posta-lo aqui é bem simples. só tem que falar meu nome e um nome que seria de uma banda de rock
Excluirfor i in range (100):
print 'fulano ',
print 'e seus sicranos'
assim deveria aparecer esse texto 100 vezes
e não é o que acontece simplesmente não aparece nada
se eu estiver fazendo algo já revisei o script ele funciona no IDLE quando escrevo e executo mais se for pra rodar já salvo só aparece
assim:========restart==========
não consigo entender será que é algum bug de versão ou meu computador?
ou meu computador esta executando tão rápido o script q eu não consigo nem ver não sei a versão do Python aqui é a 3.3.2 e meu Windows é Seven acho que já escrevi isso mais só para ter certeza.
vlw mesmo pela ajuda Julio vejo que provavelmente sem ajuda eu iria acabar desistindo porque se empaca e não tem ajuda você fica sem recurso para continuar e acaba parando no meio do caminho e não quero parar sempre tive vontade de aprender a programar e até ser um profissional nesse ramo mais para isso temos que começar espero poder passar por essa etapa e continuar aprendendo espero que possa me ajudar a resolver esse problema
Você disse que funciona no Idle, mas me parece um pouco estanho.
ExcluirPorque no python 3 o print precisa dos parenteses... tipo print("fulano")
Faz assim e ve se muda algo.
Me manda o script no email. Jcemelanda@gmail.com
Boa noite Julio,
ResponderExcluirEstou tentando usar o Python para criar uma "carteira". Por isso, preciso que em caso de eu realizar uma compra, deduza o valor da compra do valor que esta em um txt ou csv e, em caso de salario, aumente o valor. Sempre atualizando o arquivo txt ou csv, para que uma consulta no dia seguinte, considere o saldo atualizado. No entanto, com o código abaixo recebo a seguinte resposta:
Traceback (most recent call last):
File "SaldoNovo.py", line 24, in
arquivo.write(carteira)
TypeError: expected a character buffer object
-----
arquivo = open("saldo.txt",'r')
readFile = arquivo.read()
lineSplit = readFile.split()
carteira1 = lineSplit[0]
carteira = float(carteira1)
print "O valor disponivel em caixa eh: R$ %.2f." %carteira
arquivo.close()
operacao = raw_input("Compra ou salario? ")
if operacao == "salario":
salario = 5000
carteira += salario
print "\nCom a venda, o saldo ficou em R$ %.2f." %carteira
arquivo = open("saldo.txt",'a')
arquivo.write(carteira)
arquivo.close()
if operacao == "compra":
compra = 5000
carteira -= compra
print "\nCom a compra, o saldo ficou em R$ %.2f." %carteira
arquivo = open("saldo.txt",'a')
arquivo.write(carteira)
arquivo.close()
print carteira
------
Você poderia me ajudar?
Obrigado, Rafael
Olá Rafael!
ExcluirNa verdade a questão é simples:
TypeError: expected a character buffer object
Quer dizer que no write você deveria passar uma string e não foi o que você fez, carteira contém um float, então deveria ter sido convertido para string antes.
Veja este trecho da documentação oficial:
To write something other than a string, it needs to be converted to a string first:
>>>
>>> value = ('the answer', 42)
>>> s = str(value)
>>> f.write(s)
Espero que isto te ajude.
Abraço!
Ajudou sim! Quebrei a cabeça por alguns dias, mas agora funcionou. Obrigado!!
ExcluirSou leigo em programação, mas preciso fazer operações com números dentro de um arquivo.txt
ResponderExcluircomo eu manipulo-os ?
por exemplo somar todos os números, ou a primeira coluna com a segunda e assim por diante..
poderia me dar uma luz ?
Bom, você pode ler os arquivos conforme explicado no artigo, e usar o readlines para ler o arquivo uma linha por vez.
Excluirvocê pode usar a função split em cada linha passando o separador que for usado no arquivo.
por exemplo
se a linha do arquivo contiver "1 2 4 3 6 5" e esta linha estiver numa variável linha, você pode fazer:
linha.split(' ') e vai ter como resultado uma lista de valores: ['1', '2', '4', '3', '6', '5']
assim você pode usar a função int() ou eval() para transformar os números que estão como texto em números e então manipulá-los.
Vai ser muito útil pra você também o artigo sobre listas:
http://programeempython.blog.br/2010/07/estruturas-de-dados-em-python-listas.html
Boa Tarde Julio Cesar,
ResponderExcluirEsta pergunta pode não estar no post certo mas, como vim trabalhando com manipulação de arquivos, uma das tarefas está relacionada à minha dúvida.
Bom, acredito que o problema seja simples:
Eu tenho uma matriz, por exemplo, (1 2 3 4 5 6 7) e peço para o python imprimi-la.
Porém, ao invés de me dar todos os valores, ele imprime (1 2 ,...6 7). No meu caso, são mais de 4000 valores.
Gostaria de saber como faço para ele imprimir todos os valores. Ou ainda melhor, tem como passar a matriz para formato de lista e imprimir todos os valores?
Obrigado pela atenção,
Abraços
Olha, sinceramente, achei sua pergunta muito confusa.
ExcluirTrm como ser mais claro? Não entendi as entradas e saidas do sistema ou qual o probleema...
Você quis dizer que tendo uma lista [1,2,3] voce faz print lista e ele retorna ”[1,2,3]" ? Porque se for, voce tem que iterar sobre a lista e printar os valores individualmente.
Bom, tentarei simplificar: Eu li um arquivo do excel.
ExcluirO python leu como sendo uma matriz, vamos supor, A = [ 1 2 3 4 5 6 7 ].
Se eu mando imprimir: >>>print(A)
O programa deveria me retornar assim: [ 1 2 3 4 5 6 7 ]
Mas está me retornando: [ 1 2 ..., 6 7] (exatamente assim, com as reticências)
Esse é apenas um exemplo, na verdade esta matriz tem 4000 elementos.
A minha dúvida é: Como faço pra ele imprimir sem as reticências, ou seja, todos os elementos?
Obrigado
Bom, preciso de mais 2 respostas então:
ExcluirQual versão. do python esta usando?
Que biblioteca usou pra ler o excell?
Python(x,y) 2.7.5.0
ExcluirE a biblioteca é xlrd
Obrigado pela ajuda Julio.
Um abraço.
Dá uma olhada aqui nessa documentação https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966
ExcluirSe mesmo assim vc não conseguir pode falar.
Abraço.
Eu estive olhando este material, mas o problema é realmente com o programa. É apenas uma questão de imprimir ou não todos os valores, a matriz deve ser muito grande.... não sei.
ExcluirBom, você saberia me dizer como eu faço para passar os valores do formato de matriz para o formato de lista, acho que assim é mais simples.
Abraços.
Julio Cesar,
ExcluirPassei minha matriz para formato de lista usando:
lst = list(y1)
print lst
Deu certo.
Agradeço pela sua atenção e ajuda!
Um abraço.
Boa!
ExcluirAbraço!