• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Hugu

como acrescentar conteúdo(linhas) no inicio dum *.txt

21 mensagens neste tópico

Tenho esta script e o que faz é adicionar, neste caso, links sucessivamente num ficheiro externo *.txt

a = str(raw_input('Insira o link : '))
f = open('c:\..\links.txt','a+')
f.write('\n')
f.write(a)
f.close()

A script cria o ficheiro pela primeira vez e depois vai adicionando os links sucessivamente, na linha seguinte..do género:

www.link1.pt

www.link2.pt

...

Mas eu queria que os links sejam postos da seguinte maneira:

...

www.link3.pt

www.link2.pt

www.link1.pt

ou seja, o mais recente no inicio..

Como posso faze-lo?

Vê textos sobre slicing. Vais precisar de saber usar listas.

Se não encontrares/perceberes, diz que eu dou-te um exemplo :P

Também me lembrei por meio de listas e no inicio fazia uma lista com os links ja existentes e depois re-escrevia com a ordem desejada...mas como faço uma lista que varia de dimensão sempre que adiciono novo link?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lista = []
lista.append(link1)
lista.append(link2)

Exactamente, só que isto vai ficar com a lista:

x=[link1,link2,...]

que está ordenada do último para o mais recente. Podias corrê-la de trás para a frente, mas podes usar o método insert para inserir na posição que queres o recebido.

lista=[]
f = open('c:\..\links.txt','a+')
while True:
        a=raw_input("Insira o link: ") # Aqui nao precisas do método str() que usas, porque o raw_input recebe uma string
        lista.insert(0,a) # O método insert, recebe como primeiro argumento a posição onde queres inserir e o segundo, o que queres inserir
for i in lista: f.write(i+'\n')
f.close()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então, usando splicing, como disse o tirácio no outro post, podes fazer a lista "normalmente", com o append, e no fim, invertê-la:

lista = []
lista.append(link1)
lista.append(link2)

lista = lista[::-1]

Para sabers mais sobre slicing, tens um bom tutorial aqui no fórum, que agora também está na wiki :P

http://wiki.portugal-a-programar.pt/dev_geral:python:slicing

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então, usando splicing, como disse o tirácio no outro post, podes fazer a lista "normalmente", com o append, e no fim, invertê-la:

lista = []
lista.append(link1)
lista.append(link2)

lista = lista[::-1]

Para sabers mais sobre slicing, tens um bom tutorial aqui no fórum, que agora também está na wiki :P

http://wiki.portugal-a-programar.pt/dev_geral:python:slicing

Epá, agr é que vi que ele fala em slicing... Não tinha visto... :\ Sorry...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

humm..acho que não perceberam o meu problema  :)

Eu não quero fazer uma script que me inverta a posição dos links dum ficheiro ja criado e mesmo que fosse era castigo ter de voltar a meter os links todos um a um, tirácio  :P

...mas ja me deram umas ideias!  ;)

Mas era assim, a minha script adiciona links desta maneira:

www.link1.pt

www.link2.pt

...

e eu queria que ela adicionasse não a seguir ao último link, mas no inicio. Só que não vou andar adicionar links todos seguidos, p.exe.: é tipo como se fosse os bookmarks (os favoritos), estou na net e dou com um link que tenho interesse em guardar. Eu então corro a script e adiciono o link num *.txt , ele adiciona, grava e fecha o file, até uma proxima vez. Quando quero meter outro link, então volto a executar a script.. e isto ocorre com o tempo que estou a navegar..

A minha ideia era, ja que só consigo adicionar no fim, eu antes de adicionar, fazia um readlines() e metia todos os links, separadamente, numa lista, listaA (neste momento é como se ficasse com um ficheiro em branco), depois inseria o novo link numa outra lista e dizia para este tomar a posiçao listaB[0] e metia a listaA apartir da posição[1] da listaB, ou seja a listaB teria uma dimesão n+1 em relação à listaA. Depois era so fazer f.write de cada parte da listaB no ficheiro. E isto fazia-o acontecer sempre que adicionasse novo link.

Vou tentar, se tiver dificuldades ou empancar em alguma parte, volto! :biggrin:

Obrigado mais uma vez :P

p.s.:um dúvida, quando faço duplo click num ficheiro *.py (quando executo uma script no windows) ele abre-me o python.exe command line, como eu mudo para que me abra o python IDLE por defeito?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vai dar ao mesmo... Não precisas de duas listas...

f=open("links.txt",'r')
lista=f.readlines()
lista.insert(0,raw_input("Link: ")+'\n')
f=open("links.txt",'w')
for i in lista: f.write(i)
f.close()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tharis, tens que fechar o ficheiro antes de abrires para escreveres acho eu.

Quanto ao que estás a dizer, é como um append mas no início do ficheiro não é? A maneira que encontro é também a do Tharis. Pelo menos é a mais simples :)

Já agora, é UM script :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tu queres acrescentar links no início do ficheiro, certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, quer um append mas em vez de ser no fim do ficheiro, no início.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tharis, tens que fechar o ficheiro antes de abrires para escreveres acho eu.

Já agora, é UM script :P

Não, não tenho... É recomendado, mas eu não sigo recomendações... :)

Pensava que já tinha dito que script era masculino... Afinal não... :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então tens de ler o ficheiro todo para a memória, escrever o novo link e depois o que estava lá primeiro, porque não podes "empurrar" isso assim à bruta para a frente.

Ou seja:

files = open('ficheiro', 'r').readlines()[::-1]
files.append(link)
open('ficheiro', 'w').write('\n'.join(files[::-1]))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se o ficheiro for grande em vez de colocares tudo na memória podes criar um ficheiro temporário.

import os, distutils.file_util #importa os modulos

src_file = 'links.txt'
tmp_file = src_file+'.tmp'
linha = 'http://www.portugal-a-programar.org/\n'
buf_size = 8192 #quantidade de dados a ser lidos em cada loop

distutils.file_util.copy_file(src_file, tmp_file)#copia o ficheiro src_file para tmp_file, também altera os nomes

src = open(src_file, 'wb')#abre o ficheiro, apagando o seu conteudo
src.write(linha)#escreve o novo link
tmp = open(tmp_file, 'rb')#abre o ficheiro temporario criado
while 1:
    data = tmp.read(buf_size)#le um bloca de dados
    if not data:#se nao houver dados:
        tmp.close()#fecha o ficheiro temporario
        os.remove(tmp_file)#apaga-o
        break#sai do loop
    src.write(data)#escreve os dados do ficheiro temporario para o ficheiro original

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acabei por desisitir da minha ideia de usar duas listas e peguei no script do Tharis..

..alterei no 1º openfile a tag "r" para "a+" porque no instante inicial, como não tenho ficheiro criado, o programa dá erro.. e acrescentei um print para me informar os links existentes..  :D

Assim:

f = open('c:\...\links.txt','a+')
lista=f.readlines()
print len(lista),' links!'
lista.insert(0,raw_input('Insira o Link:')+'\n')
f=open("c:\...\links.txt",'w')
for i in lista:
    f.write(i)
f.close()

Mas obrigado a todo o pessoal!  :D

Estão a ser uma grande ajuda! n por me ajudarem a fazer o script, porque é apenas uma brincadeira didáctica, mas assim na minha aprendizagem!..

Ah! Mas isto não vai parar por aqui, o programa vai evoluir! :biggrin: Estou agora a pensar acrescentar "comentários"  aos links e organizá-los por categorias!..por isso espero continuar com a vossa ajuda! Mas vou tentar eu primeiro...  :D

até breve..  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fnds: interessante!..assim pode-se evitar a perda dos dados do ficheiro por overflow ..mas o que se entende por ficheiro grande? qual o tamanho da memória que o python usa?  :hmm:

fnds, posso pedir um favor? Dá para fazer uns comentários no script, como fez o Tharis em #2, para saber o que é o quê e o que faz cada linha de código?  ;)

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O python usa a memoria que tu lhe disseres para usar caso nao lhe des um montante ele vai tentar carregar todo o ficheiro na memoria tens aqui um exemplo

Obter o md5 de um ficheiro....


def GetMd5(file):
        fh = open(file,"rb") #abre o ficheiro em modo de leitura binario
        digest = md5.new()
        while 1:
            buf = fh.read(5120) #quantidade de memoria que vai ser utilizada de cada vez, depois de lido o bloco carrega um novo e descarta o anterior
            if buf == "": #quando todos os blocos forem lidos
                break
            digest.update(buf)
        fh.close()
        final_md5=digest.hexdigest()
        print final_md5

Porque dar este exemplo??? Simples tenta obter o md5 de um ISO de um DVD sem a variavel buf(quantidade de memoria a usar) o computador vai ficar extremamente lento(ou encravar) :S mas se deres a quantidade de memoria a usar alem de ser muito mais rápido porque não precisas de esperar 4gb serem lidos nao encravas o pc!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fnds: interessante!..assim pode-se evitar a perda dos dados do ficheiro por overflow ..mas o que se entende por ficheiro grande? qual o tamanho da memória que o python usa?  :hmm:

A tamanho do ficheiro que abrires.

fnds, posso pedir um favor? Dá para fazer uns comentários no script, como fez o Tharis em #2, para saber o que é o quê e o que faz cada linha de código?  :)

Feito ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pessoal por colocarem mini-comentários ao longo dos scripts que sugerem!  :P

Ajuda mto e facilita imenso o processo de aprendizagem e compreensão da semântica á volta desta linguagem de programação!

E qto ao meu script, ficou um bocado parado.. o tempo n dá para tudo e o dia só tem 24h  :cheesygrin: mas não deixei de ir magicando na minha cabeça ideias a implementar!  :P

Vou retomar e em breve vou dando noticias e ou, mais provável, pedir vossa ajuda de novo!  :D  :P

Mais uma vez obrigado a todos!

Abr

p.s.: ah e parabéns atrasados a todos vós que fizeram e fazem desta comunidade um excelente grupo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora