Hugu Posted May 22, 2008 at 02:30 AM Report #186626 Posted May 22, 2008 at 02:30 AM 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?
djthyrax Posted May 22, 2008 at 08:26 AM Report #186638 Posted May 22, 2008 at 08:26 AM lista = [] lista.append(link1) lista.append(link2) 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!
Tharis Posted May 22, 2008 at 12:14 PM Report #186665 Posted May 22, 2008 at 12:14 PM 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()
JoaoRodrigues Posted May 22, 2008 at 01:45 PM Report #186687 Posted May 22, 2008 at 01:45 PM 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
Tharis Posted May 22, 2008 at 02:10 PM Report #186700 Posted May 22, 2008 at 02:10 PM 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...
Hugu Posted May 23, 2008 at 03:33 AM Author Report #186856 Posted May 23, 2008 at 03:33 AM 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?
Tharis Posted May 23, 2008 at 08:24 AM Report #186860 Posted May 23, 2008 at 08:24 AM 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()
JoaoRodrigues Posted May 23, 2008 at 03:52 PM Report #186927 Posted May 23, 2008 at 03:52 PM 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 👍
djthyrax Posted May 23, 2008 at 06:33 PM Report #186954 Posted May 23, 2008 at 06:33 PM Tu queres acrescentar links no início do ficheiro, certo? 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!
JoaoRodrigues Posted May 23, 2008 at 10:47 PM Report #187007 Posted May 23, 2008 at 10:47 PM Sim, quer um append mas em vez de ser no fim do ficheiro, no início.
Tharis Posted May 23, 2008 at 11:03 PM Report #187012 Posted May 23, 2008 at 11:03 PM 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... 👍
djthyrax Posted May 24, 2008 at 10:03 AM Report #187078 Posted May 24, 2008 at 10:03 AM 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!
fnds Posted May 25, 2008 at 05:46 PM Report #187405 Posted May 25, 2008 at 05:46 PM 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
djthyrax Posted May 25, 2008 at 06:27 PM Report #187423 Posted May 25, 2008 at 06:27 PM Falta-te aí o import ao distutils. 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!
Hugu Posted May 26, 2008 at 12:36 AM Author Report #187490 Posted May 26, 2008 at 12:36 AM 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.. 😛
fnds Posted May 26, 2008 at 12:48 PM Report #187550 Posted May 26, 2008 at 12:48 PM Falta-te aí o import ao distutils. E ao os, corrigido 😉
Hugu Posted May 27, 2008 at 02:32 AM Author Report #187776 Posted May 27, 2008 at 02:32 AM 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!
newbeen Posted May 27, 2008 at 02:43 AM Report #187777 Posted May 27, 2008 at 02:43 AM 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
fnds Posted May 27, 2008 at 10:57 AM Report #187811 Posted May 27, 2008 at 10:57 AM 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 😉
Hugu Posted June 2, 2008 at 04:14 PM Author Report #189149 Posted June 2, 2008 at 04:14 PM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now