player Posted August 12, 2009 at 08:00 PM Report #283018 Posted August 12, 2009 at 08:00 PM Boas. Eu estou a fazer uma pequena agenda electrónica e até agora, ainda só adiciona Contactos e algumas informações e vai guardado-as num arquivo de texto. Estava a pensar adicionar uma função remover e já estive a tentar mas não consigo fazer com que ele apague o Contacto nem as informações desse contacto. Será que existe alguma maneira de apagar sem ser manualmente no ficheiro? Cumps e obrigado
djthyrax Posted August 12, 2009 at 08:12 PM Report #283027 Posted August 12, 2009 at 08:12 PM Podes mostrar o teu código? É que o que escreveste é muito vago. 👍 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!
player Posted August 13, 2009 at 06:09 AM Author Report #283071 Posted August 13, 2009 at 06:09 AM Podes mostrar o teu código? É que o que escreveste é muito vago. 👍 Aqui está ele agenda = open('c:/agenda.txt','a') if 'Agenda Telefonica\n' in open('c:/agenda.txt','r'): agenda.close() else: agenda.write('Agenda Telefonica\n') def adicionar(): agenda = open('c:/agenda.txt','a') nome = raw_input('Nome Contacto: ') try: contacto = raw_input('Numero Telefone: ') contacto = int(contacto) except: print 'Por favor, use so numeros no contacto' email = raw_input('Email: ') agenda.write('Nome: %s\nContacto: %d\nEmail: %s\n\n' % (nome,contacto,email)) agenda.close() Aí está uma parte dele, aquela parte inicial, onde tem Agenda Telefonica, está meia esquisita mas até agora tem resultado. Depois a seguir eu estava a pensar numa função remover() mas não sei como é que a função vai ao ficheiro e apague só aquele nome que eu peço e as informações desse nome.
djthyrax Posted August 13, 2009 at 02:49 PM Report #283132 Posted August 13, 2009 at 02:49 PM Ora, tens de ler a agenda para a memória a apagares apenas o que queres. Pegando no formato do ficheiro, assim de relance tens que fazer isto: contactos = [] for registo in open('agenda', 'r').read()[13:].split("\n\n"): if registo.strip() == "": continue nome, contacto, email = registo.split("\n") contactos.append({'Nome': nome[6:], 'Contacto': int(contacto[10:]), 'Email': email[7:]}) #acabaste de ler os contactos para uma lista. agora é apagar a que não queres del contactos[0] #apagaste o 1º contacto #agora é só gravar open('agenda', 'w').write("Agenda Telefonica\n" + ("\n".join(["Nome: %(Nome)\nContacto: %(Contacto)\nEmail: %(Email)\n" % registo for registo in contactos])) + "\n") Alguma dúvida, avisa. 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!
player Posted August 13, 2009 at 03:16 PM Author Report #283140 Posted August 13, 2009 at 03:16 PM Ora, tens de ler a agenda para a memória a apagares apenas o que queres. Pegando no formato do ficheiro, assim de relance tens que fazer isto: contactos = [] for registo in open('agenda', 'r').read()[13:].split("\n\n"): if registo.strip() == "": continue nome, contacto, email = registo.split("\n") contactos.append({'Nome': nome[6:], 'Contacto': int(contacto[10:]), 'Email': email[7:]}) #acabaste de ler os contactos para uma lista. agora é apagar a que não queres del contactos[0] #apagaste o 1º contacto #agora é só gravar open('agenda', 'w').write("Agenda Telefonica\n" + ("\n".join(["Nome: %(Nome)\nContacto: %(Contacto)\nEmail: %(Email)\n" % registo for registo in contactos])) + "\n") Alguma dúvida, avisa. Assim de repente está um bocado confuso para mim, mas ainda estou "fresco" na linguagem, mas eu vou investigar isso e fazendo uns testes com isso e ver se percebo melhor, se realmente não conseguir eu depois digo alguma coisa. Obrigado
djthyrax Posted August 13, 2009 at 03:22 PM Report #283142 Posted August 13, 2009 at 03:22 PM Em relação aos [11:], pesquisa por slicing. Tens um tutorial aqui no fórum. Em relação ao append, usei um dicionario (dict). Em relação à escrita, usei listas por compreensão e nas formatting strings, usei uma coisa que existe que basicamente meto o indexes do dicionário em vez de s e d, e passo como "argumento" o dict. As listas por compreensão podem ser "convertidas" para um for assim: resultado = [instrução for elemento in lista] # resultado = [] for elemento in lista: resultado.append(instrução) Em relação ao split, join, etc, no interpretador do python faz isto: help("wtv".join) help("wtv".split) help("wtv".strip) help([].append) 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!
player Posted August 13, 2009 at 04:53 PM Author Report #283150 Posted August 13, 2009 at 04:53 PM Ora, tens de ler a agenda para a memória a apagares apenas o que queres. Pegando no formato do ficheiro, assim de relance tens que fazer isto: contactos = [] for registo in open('agenda', 'r').read()[13:].split("\n\n"): if registo.strip() == "": continue nome, contacto, email = registo.split("\n") contactos.append({'Nome': nome[6:], 'Contacto': int(contacto[10:]), 'Email': email[7:]}) Alguma dúvida, avisa. Obrigado pela informação acima. Agora em relação a parte do quote, se eu entendi bem, a parte do código que está no quote vai adicionar aquelas informações a lista contactos certo? Mas que parte do código é que faz o nome,contacto e email ser um só para depois ao apagar o nome apagar o resto dos dados, tipo uma chave com 3 valores? Percebeste o que eu quis dizer?
djthyrax Posted August 13, 2009 at 08:06 PM Report #283179 Posted August 13, 2009 at 08:06 PM Imagina que tens um ficheiro com 2 contactos. O que aquilo faz é ler o ficheiro todo, usar tudo menos aquela linha inicial, e partir em bocados em todos os \n\n (ou seja, depois do email e antes do "Nome:"). Esses bocados têm o formato "Nome: %s\nContacto: %d\nEmail: %s". O que faço é iterar esse conjuntos de bocados e parti-los no \n e assim fico com uma lista com "Nome: %s", "Contacto: %d" e "Email: %s" que "delego" às 3 variáveis e depois tiro o bocado que não me interessa. No entanto, o split no final do ficheiro vai criar um elemento vazio, daí ter aquele if. 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!
player Posted August 14, 2009 at 09:34 AM Author Report #283241 Posted August 14, 2009 at 09:34 AM Tipo, outra cena que não estou a entender muito bem é o uso do slicing, porque é que o usaste? Desde já obrigado pela ajuda que me vais dando 😞
djthyrax Posted August 14, 2009 at 01:32 PM Report #283289 Posted August 14, 2009 at 01:32 PM Para tirar os bocados de texto que não me interessam. 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!
player Posted August 14, 2009 at 02:27 PM Author Report #283295 Posted August 14, 2009 at 02:27 PM Para tirar os bocados de texto que não me interessam. Retirar? Desculpa mas não compreendi outra vez. Então o slicing vai cortar mas não o desnecessário acho eu, por exemplo nome = 'Rui Oliveira' nome[6:] 'iveira' E outra coisa, eu quando tento correr o teu código para ver o funcionamento e isso dá erro. remover() Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "F:\Agenda_Electronica2.py", line 23, in remover nome, contacto, email = registo.split("\n") ValueError: too many values to unpack E o strip(), o que é que ele faz? Simplesmente remove espaços entre strings? Desculpa lá e obrigado.
djthyrax Posted August 14, 2009 at 03:10 PM Report #283302 Posted August 14, 2009 at 03:10 PM Retirar? Desculpa mas não compreendi outra vez. Então o slicing vai cortar mas não o desnecessário acho eu, por exemplo nome = 'Rui Oliveira' nome[6:] 'iveira' Exacto. E outra coisa, eu quando tento correr o teu código para ver o funcionamento e isso dá erro. remover() Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "F:\Agenda_Electronica2.py", line 23, in remover nome, contacto, email = registo.split("\n") ValueError: too many values to unpack Mete isso dentro de um try...except como este: try: nome, contacto, email = registo.split("\n") except ValueError: print ">>> ", registo E diz-me o qeq ele imprime. E o strip(), o que é que ele faz? Simplesmente remove espaços entre strings? Remove todo o whitespace de uma string. 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!
player Posted August 14, 2009 at 04:35 PM Author Report #283310 Posted August 14, 2009 at 04:35 PM Exacto.Mete isso dentro de um try...except como este: try: nome, contacto, email = registo.split("\n") except ValueError: print ">>> ", registo E diz-me o qeq ele imprime Vai imprimir os dados que estão dentro do ficheiro agenda.txt, mas isso ocorre por causa do except não é? E o ValueError: too many values to unpack significa o quê? Eu já estive a dar uma vista de olhos mas não percebi muito bem, li que esse erro ocorre quando não tem variáveis suficientes no for mas não consigo perceber. E tipo o registo.split('\n') faz alguma coisa? Eu tentei com e sem o \n e o resultado é o mesmo Obrigado 😞
djthyrax Posted August 14, 2009 at 05:21 PM Report #283312 Posted August 14, 2009 at 05:21 PM Boa, mas eu quero saber o output concretamente. 😞 O erro ocorre quando há mais pedaços do que eu especifiquei. Isto é, o split devolve uma lista de 4 elementos e eu tenho apenas 3 variaveis. 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!
player Posted August 14, 2009 at 06:14 PM Author Report #283315 Posted August 14, 2009 at 06:14 PM Boa, mas eu quero saber o output concretamente. 😞 O erro ocorre quando há mais pedaços do que eu especifiquei. Isto é, o split devolve uma lista de 4 elementos e eu tenho apenas 3 variaveis. Ok então aqui está o resultado: >>> nica Nome: Rui Contacto: ************ Email: *************** Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "F:\Agenda_Electronica2.py", line 27, in remover contactos.append({'Nome': nome[6:], 'Contacto': int(contacto[10:]), 'Email': email[7:]}) UnboundLocalError: local variable 'nome' referenced before assignment Em relação ao ValueError já entendi.
djthyrax Posted August 14, 2009 at 06:59 PM Report #283325 Posted August 14, 2009 at 06:59 PM Podes pôr aí o conteudo do ficheiro? É que cheira-me que o formato do ficheiro está incorrecto. 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!
player Posted August 14, 2009 at 07:19 PM Author Report #283329 Posted August 14, 2009 at 07:19 PM Podes pôr aí o conteudo do ficheiro? É que cheira-me que o formato do ficheiro está incorrecto. O conteúdo é basicamente aquele que aparece e está em formato txt. O conteúdo é este Agenda Telefonica Nome: Rui Contacto: ********* Email: *******************
djthyrax Posted August 14, 2009 at 11:33 PM Report #283362 Posted August 14, 2009 at 11:33 PM Não é open('agenda', 'r').read()[13:].split("\n\n"): mas sim open('agenda', 'r').read()[18:].split("\n\n"): 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!
player Posted August 16, 2009 at 03:42 PM Author Report #283486 Posted August 16, 2009 at 03:42 PM Ainda continuo sem perceber algumas partes basicamente são estas for registo in open('c:/agenda.txt', 'r').read()[17:].split("\n\n"): Porque é que usaste dois \n em vez de um, o efeito é o mesmo if registo.strip() == "": continue O que é que o "" significa? Eu tentei fazer testes mas não tinha resultados nome, contacto, email = registo.split("\n") Este basicamente não o entendi todo, mas é mais aquele = e o split('\n' que estão a fazer confusão Por agora é só mas se aparecer mais eu pergunto 😞 Cumps e obrigado
djthyrax Posted August 16, 2009 at 09:00 PM Report #283512 Posted August 16, 2009 at 09:00 PM Usei 2 \n porque 2 newlines significa que há uma linha vazia, enquanto que apenas 1 newline significa que se mudou apenas de linha 1 vez. O "" é uma string vazia. Isto é, se tirarmos todo o whitespace da string registo, se ficar uma string vazia, passamos à próxima iteração do loop. x, y, z = a é o mesmo que x = a[0]; y = a[1]; z = a[2]. Em relação ao split aí, é para dividir as linhas umas das outras. 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!
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