Jump to content

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


Hugu
 Share

Recommended Posts

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 😛

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?

Link to comment
Share on other 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()
Link to comment
Share on other 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 😛

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

Link to comment
Share on other 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 😛

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

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

Link to comment
Share on other 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  😛

...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! 😁

Obrigado mais uma vez 😛

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?

Link to comment
Share on other sites

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

Já agora, é UM script 😛

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... 👍

Link to comment
Share on other 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]))

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other 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
Link to comment
Share on other 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..  😄

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!  😄

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! 😁 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...  😄

até breve..  😛

Link to comment
Share on other 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?  ?

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!

Link to comment
Share on other 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!!!

RHCE - 120-062-534

Link to comment
Share on other 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?  ?

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 😉
Link to comment
Share on other sites

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

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  😁 mas não deixei de ir magicando na minha cabeça ideias a implementar!  😛

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

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!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.