Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 7
1
Comincia a diventare pane per denti più robusti dei miei.

Effettuando una ricerca, ho individuato un caso apparentemente similare, mi sembra di capire risolto con l'installazione di alcune librerie SDL, esattamente :
Citazione
The newer packages are building with SDL2 support and without pygame support. I'm guessing the deps on the package didn't get updated. You should be able to fix this for now by running sudo apt-get install libsdl2-2.0-0 libsdl2-image-2.0-0 libsdl2-mixer-2.0-0 libsdl2-ttf-2.0-0.

Sembrerebbero coinvolte anche le librerie pygame (sono ignorante anche su di esse), ti suggerirei di leggerti il post e comparare la situazione con la Tua ... magari qualche utente più capace di me saprà darti dritte migliori, io non saprei dirTi di più.

Ciao :)

2
Si. avevo letto il contenuto di questa pagina
L’installazione l’ho eseguita prendendo i comandi dal sito kivy.org per python3 e che riporto di seguito. Se può essere utile il SO è Ubuntu 19.10...
stable builds:   $ sudo add-apt-repository ppa:kivy-team/kivy
nightly builds:   $ sudo add-apt-repository ppa:kivy-team/kivy-daily

Vedo che hai indicato entrambi i repository ... non è che li hai aggiunti entrambi? Chiedo ciò perché nella pagina è scritto :
Citazione
Add one of the PPAs as you prefer
    stable builds:   $ sudo add-apt-repository ppa:kivy-team/kivy
    nightly builds:   $ sudo add-apt-repository ppa:kivy-team/kivy-daily

ed utilizzare i ppa delle versioni in sviluppo non è mai una idea grandiosa, a meno che non si voglia fare il beta-tester, comunque ne andrebbe aggiunto solo uno dei due.

3
Ciao @Magnum,

Non conosco la libreria kivy, però, guardando il trace noto :
Citazione
egl_rpi - ImportError: cannot import name 'bcm' from 'kivy.lib.vidcore_lite' (/usr/lib/python3/dist-packages/kivy/lib/vidcore_lite/__init__.py)
...
sdl2 - ImportError: libSDL2_image-2.0.so.0: cannot open shared object file: No such file or directory
...
x11 - ModuleNotFoundError: No module named 'kivy.core.window.window_x11'

Cosa che mi ha pensare a problemi dovuti alla modalità di installazione effettuata. Forse l'hai effettuata in un virtual-environment?
In tal caso dovresti sincerarti dalla docs quali sono le dipendenze necessarie e provvedere alla loro installazione e relativa configurazione, occorrendo.

in alternativa :
Ho guardato nei pacchetti di Ubuntu, nella versione 18.04 esistono i pacchetti python-kivy, python-kivy3 e python-kivy-examples, ovviamente non ho proceduto ad installarli ma una soluzione potrebbe essere quella di eseguirne l'installazione nel sistema, penso che probabilmente le dipendenze verrebbero risolte.

4
Esercizi / Re:Fare delle liste
« il: Novembre 13, 2019, 13:52 »
Ho usato blocco note.
Sì è solo uno pseudocodice che mi sono scritto per tenere il ragionamento a mente.
Studio su diversi supporti, un video corso, un libro apogeo e... Internet.

... Ah, è studio e pseudo-codice allora.

Sul Tuo quesito mi son divertito ad ipotizzare una struttura dati pseudo-csv ed a tirar fuori dizionari e liste di liste tramite metodi comprehensions, in python sono un iniziando come Te, non ho postato nulla non sapendo cosa in realtà a Te serva.

In merito a quali aspetti Ti occorre aiuto?

[Edit] P.S. : se usi windows, utilizza meglio Notepad++ come editor per iniziare o direttamente IDLE (suppongo che anche nelle versioni windows possa creare files)

5
Ciao @bebo, grazie dell'attenzione :)

Forse non ho letto attentamente, ma non sarebbe piu' semplice mettere in piedi un servizio DNS oltre al DHCP? Cosi' anziche' dover andare a navigare nella rete potresti lasciare al DNS fare il suo lavoro.
Si certamente sarebbe più semplice, ho ventilato l'ipotesi e riguardo a :
Oppure chiedere che il DHCP venga applicato solo su una porzione di sottorete, es 100-250/24, e lasciare i numeri 1-100/24 liberi di usare indirizzi statici? Questo lo faccio anche a casa sul router del mio ISP.
Ho richiesto esplicitamente, senza riscontro, l'assegnazione degli IP statici necessari, cosa semplicissima da fare ma che è stata rifiutata, a detta del locale "referente di rete".

... il motivo? L'avevo accennato :
Citazione
un sistema DHCP con controllo eterno (oltre tutto ben poco "disponibile" a dialogo ed integrazioni)

Purtroppo, ciò in cui mi trovo coinvolto è un problema politico, non tecnico, che ho avuto la sorpresa di trovare al rientro dalle ferie estive : la nostra rete, perfettamente funzionante e gestita in locale era stata ri-cablata (mai capito il perché) ed appaltata la gestione ad una ditta esterna in base a specifiche dettate da un ente esterno che ha evidente intenzione di fagocitare quello in cui lavoro.

Tra l'altro, inspiegabilmente, alcune applicazioni provenienti da "esterno" (basate su sistemi windows) erano state messe in condizioni di funzionare, non così quelle basate su server "linux", il risultato è stato che la ragioneria poteva lavorare solo sulla console disponibile sul server del bilancio aziendale (ora su sub-rete isolata con gli altri hosts coinvolti) ed il resto era inaccessibile. Nessuno si è preso il "disturbo" di avvisarmi della faccenda e la dirigenza, a tutti i livelli, a parte chiedermi di risolvere il problema latita.

Ora, il problema lo ho risolto nel modo rozzo descritto precedentemente ma vorrei suggerimenti riguardo a cosa andare a vedere per rendere l'insieme un po' più razionale nelle circostanze attuali che prima o poi, inevitabilmente, andranno "chiarite".

6
Base / Re:Livello di indentazione di blocchi if-else
« il: Novembre 04, 2019, 09:33 »
Un saluto a tutt*
...
vorrei capire la regola per la de-indentazione dell'else rispetto al costrutto if-else di cui fa parte. Non sono stato capace di trovare la relativa pagina di documentazione ufficiale
Grazie per l'attenzione.

Ciao @rai

per la domanda, mi sembra ovvio che è proprio il livello di identazione/de-identazione a stabilire di "cosa" faccia parte il costrutto else.

Nel caso specifico del codice proposto, il costrutto "else" non fa parte di una struttura if-else, bensì di un costrutto "for-else" e l'else viene eseguito alla fine del ciclo for, a meno che non intervenga una istruzione "break" che interrompa il ciclo. Ciò a meno che io non abbia preso cantonate (sono molto ignorante, in inglese particolarmente)

ho pensato un po' a come esemplificare la cosa ... un po' lunghetto ma guarda questo codice, vale mille parole:

>>> report = {}
>>> numeri = range(11)
>>> inp = input('Numero? ("A" per annullare) : ')
Numero? ("A" per annullare) : 3
>>> while inp != 'A':
try:
imm = int(inp)
inseriti.append(imm)
except ValueError:
pass
inp = input('Numero? ("A" per annullare) : ')


Numero? ("A" per annullare) : 12
Numero? ("A" per annullare) : 4
Numero? ("A" per annullare) : A
>>> inseriti
[3, 12, 4]
>>> for n in inseriti:
lst = []
for num in numeri:
if num == n:
lst.append('trovato')
if n % 2:
lst.append('dispari')
else:
lst.append('pari')
break
else:
lst.append("NON c'è")
report[str(n)] = lst


>>> for key in report.keys():
print(key, ' : ', report[key])


3  :  ['trovato', 'dispari']
12  :  ["NON c'è"]
4  :  ['trovato', 'pari']
>>>


Come vedi, ho costruito due cicli for per valutare la presenza delle immissioni in un range numerico definito, quando l'immissione esiste nel range il ciclo viene interrotto e lo "else" corrispondente al ciclo for non eseguito, diverso accade in caso non sia presente.
Ho cercato di evidenziare l'importanza della identazione con un secondo "else" presente nel ciclo di decisione se un numero è pari o dispari ... spero che ciò chiarisca quanto richiesto.

La ricerca da effettuarsi e su "for-else", trovato per Te questo tip

7
Buon giorno, signori.

Mi son trovato a dover affrontare un cambio della modalità della rete ethernet in ambito lavorativo che, per motivi vari, è passata dalla condizione di rete ad indirizzi TCP-IP fissi, sotto il controllo del personale interno, ad un sistema DHCP con controllo eterno (oltre tutto ben poco "disponibile" a dialogo ed integrazioni) che ha causato il crollo di tutte le applicazioni localmente sviluppate, tra cui alcune estremamente critiche.
Per le applicazioni critiche ho risolto creando una sotto-rete ad IP fissi e spostando nella stessa le macchine interessate alla gestione, negando qualsiasi comunicazione esterna.

Per quanto riguarda gli aspetti di mero servizio, ho risolto sviluppando dei prototipi in python per tentare l'individuazione in rete dei server ed una volta riuscita, traducendo i metodi in java/visual basic integrandoli nelle applicazioni interessate, lasciando il funzionamento nell'ambito della rete DHCP.

In questa seconda fascia, le tipologie di server interessati sono : PostgreSQL, FTP, SSH ed HTTP.
La strategia di approccio da me "ideata" è stata, preliminarmente :
- per i database, inserita una tavola con un campo identificativo specifico della base dati ed una tavola riferente agli altri server contenente i dati identificativi ed utenza necessari;
- per i server FTP inserendo stringhe identificative nel banner degli stessi;
- per gli SSH nessuna (li uso solo io);
- per gli HTTP spostando le porte di ascolto dei vari virtual-host e costruendo un launcher java per ovviare alla riveniente inutilità dei files "hosts" (la lan locale non dispone di server DNS, che poi bisognerebbe comunque trovare).

Dal punto di vista del software di ricognizione, ho realizzato due moduli, dei quali risparmio il codice, a meno che non lo si ritenga utile, il primo (~100 righe + test] dedicato a rilevare le schede fisiche di rete ed i relativi IP4 oltre che alla scansione delle porte di ascolto, tramite socket, nell'intervallo 1-254 delle sotto-reti individuate nella macchina, il secondo (~250 righe + test) si occupa di stabilire i tentativi di connessione ed identificazione dei server "giusti" (nella rete ho identificato diversi "servizi" che non sono locali).

Or bene, sono consapevole che la modalità su esposta, pur se funzionale è senz'altro rozza, non mi sono mai interessate le problematiche di "rete" ed ho dovuto improvvisare in fretta, la domanda è :

Siete a conoscenza di modalità migliori per impostare ed individuare in lan locale dei server di cui non conoscete l'indirizzo? E se si, sapreste darmi indicazione di dove/come acquisire le tecniche necessarie?

Grazie dell'attenzione, i miei saluti.

8
Base / Re:Aggiornamento output nel terminale con end=''
« il: Ottobre 06, 2019, 06:28 »
Della serie non bisogna mai intestardirsi ...

Riletta stamattina la docs
>>> help('print')
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
...   


Mi è subito saltato agli occhi quel "flush=False" ... posto a "True", ovviamente funziona come "mi aspettavo" ... e si che l'avevo riletto 50 volte :(

Chiedo scusa per il post così "scemo" ... ero entrato in loop

9
Base / [Risolto] Aggiornamento output nel terminale con end=''
« il: Ottobre 05, 2019, 18:49 »
Signori, i miei saluti.

In fase di test di una classe in sviluppo per un oggetto dedicato alla scansione di lan locale per l'individuazione di eventuali hosts  in ascolto ho riscontrato un curioso "effetto" utilizzando una istruzione
print('.', end='')

con output destinato ad un normale trminale bash : l'output relativo NON viene mostrato prima della conclusione del processo (un po' lunghetto).

Il problema si presenta anche in caso si utilizzi uno spazio quale terminazione del print mentre funziona regolarmente in caso di utilizzo di un newline.

... Curioso ma non stranissimo il fenomeno, mi sta facendo "incarognare" ma per quanto ci giri attorno e cerchi in rete non sto trovando soluzione (un time.sleep(qualcosa) non serve), non riesco a far aggiornare quel dannato output.
È probabile la "soluzione" sia banale ma proprio non mi riesce di immaginare dove altro cercarla ... qualcuno conosce la problematica?

Non credo se serva in merito, ma giusto in caso io ne sia inconsapevole causa, questo è l'oggetto che dovrebbe produrre quell'output (con tutte le "sporcature" del litigio

class ScanPortLan():
    '''
Esegue la scansione di una specifica porta su tutti gli indirizzi della rete
locale al fine di individuare su quali macchine vi è "qualcosa" in ascolto.
    '''
    def __init__(self, ip, porta):
        '''
Inizializzazione dell'oggetto, memorizza quali variabili di istanza l'indirizzo
locale e la porta da verificare.

Parametri : ip    - stringa dell'indirizzo ipv4 della macchina
            porta - porta da verificare
        '''
        self.ind_ascolto = []
        self.my_ip = ip
        self.porta = porta
        self.scan()
   
    def scan(self):
        '''
Tenta una connessione alla porta definita nel range 1/254 della rete locale,
escluso il proprio indirizzo.
Memorizza gli indirizzi che hanno dato risposta.
        '''
        base = self.my_ip.split('.')
        base_ind = '.'.join(base[:-1])
        for p in range(1, 255):
            curr_ip = base_ind + '.' + str(p)
            if curr_ip != self.my_ip:
                if self.connetti(curr_ip):
                    print('\n', curr_ip, '<-->', 'CONNESSO')
                    self.ind_ascolto.append(curr_ip)
                else:
                #print('.', end='')
                    #print('.', end=' ')
                    print('.', end='\n')
                    #print('.')
            time.sleep(0.5)
        print()
        print('Hosts in ascolto:')
        for ip in self.ind_ascolto:
            print('\t', ip)
   
    def connetti(self, ip):
        try:
            s = socket.socket(socket.AF_INET)
            s.settimeout(0.5)
            s.connect((ip, self.porta))
            result = True
        except OSError:
            result = False
        finally:
            if s:
                s.close()
        return result

Manca la restituzione di quanto trovato.

questa è la sua corrente invocazione di test

if __name__ == '__main__':
    llhr = LocalLanHdwRec()
    for ip in llhr.get_ip4():
        ScanPortLan(ip, 21)


e questo è un esempio della disdicevole casistica :

NzP:~$ python3 recognizer.py
^C..............Traceback (most recent call last):
  File "recognizer.py", line 106, in <module>
    ScanPortLan(ip, 21)
  File "recognizer.py", line 64, in __init__
    self.scan()
  File "recognizer.py", line 82, in scan
    time.sleep(0.5)
KeyboardInterrupt
NzP:~$ python3 recognizer.py


Ciao e grazie dell'attenzione :)

10
Per eventuali interessati :

Ho, infine, trovato questa documentazione (che poi è la stessa indicata prima, letta meglio  :angry: )sul modulo netifaces ove indica (verso metà pagina) esplicitamente la modalità con la quale ottenere il mac di una scheda, utilizzando la costante netifaces.AF_LINK.

Applicando dette indicazioni, per ottenere l'indirizzo da trattarsi si potrebbe procedere così :
>>> for scheda in ni.interfaces():
indirizzi = ni.ifaddresses(scheda)
mac_addr = indirizzi[ni.AF_LINK][0]['addr']
print(scheda, 'mac :', mac_addr)


lo mac : 00:00:00:00:00:00
enp2s0 mac : a0:d3:c1:3d:7e:32
>>>

11
Programmazione in rete - web / Re:Inviare email
« il: Settembre 27, 2019, 10:13 »
ho testato tale soluzione
non da errori ma non invia mail

E quindi chiedi aiuto? :)

... va be', anche sul 'chiede aiuto' bisogna imparare come si fa ... allora :

1° :  a parte il link non hai postato assolutamente niente su cosa hai fatto ed in quale ambiente lo hai fatto

Le sfere di cristallo sono merce rara ed in dotazione di pochi e certamente nessuno di quei pochi si mette a programmare, quindi quando "qualcosa" non ti funziona devi dettagliare "cosa" hai fatto, magari postando il codice da Te utilizzato.
Per altro, nel video d'esempio si vede chiaramente che lo stesso esempio è eseguito in ambiente linux, io utilizzo linux (esclusivamente) e ripetendo gli esempi posti nel video ho avuto esattamente l'output in analogia a quanto mostrato ... ma non è detto che la cosa si ripeterebbe analoga in ambiente windows dato che a giudicare dalle macchine di miei colleghi molte operazioni non sono permesse da tale s.o. se non esplicitamente autorizzate. Non saprei se e quanto possa essere significativo, magari altri utenti che hanno familiarità con detto sistema potranno pronunciarsi, ma Tu quale s.o. hai utilizzato?

2° : Per altro, hai detto di non aver avuto errori ... la cosa fa pensare.
Le funzioni utilizzate nell'esempio restituiscono tutte un output : hai provveduto a catturare quell'output e a verificarne l'analogia con quello in esempio?, ed in particolare hai ricevuto le due parentesi graffe "{}" che avrebbero dovuto essere restituite ad invio riuscito?

3° : cosa intendi con "la mail non è stata inviata"?
Se hai avuto un errore (da quanto hai detto sembrerebbe di no), posta l'errore ... se invece intendi che non l'hai "trovata" nella casella di posta ... hai controllato in una eventuale casella dedicata allo spam?
Ciò perché un messaggio effettuato con quella modalità ha tutte le caratteristiche dello spam ;)

Non considerare quanto su un "riprenderti", è stato scritto solo per farti comprendere che per ricevere aiuto devi impegnarti innanzi tutto Tu a fornire dati validi su cui si possa ragionare, altrimenti come si fa ad intuire la situazione?

12
Programmazione in rete - web / Re:Inviare email
« il: Settembre 26, 2019, 07:47 »
se fosse con yahoo mail come dovrei impostare lo script?

A giudicare da questa pagina, dovrebbe essere sufficiente seguire il percorso del link da Te indicato sostituendo questa istruzione
email = smtplib.SMTP("smtp.gmail.com", 587)

con una di queste due :

email = smtplib.SMTP("smtp.mail.yahoo.it", 465)

oppure

email = smtplib.SMTP("smtp.mail.yahoo.it", 25)


Scusa la domanda, nella Tua presentazione hai affermato che stai iniziando ora con python, Ti sei seguito almeno il corso base nel sito che Tu stesso hai indicato?

Chiedo questo perché il tenore delle domande poste nel post mi fa dubitare che magari possano essere argomenti un po' prematuri senza avere i concetti base acquisiti.

Ciao

13
Programmazione in rete - web / Re:Inviare email
« il: Settembre 25, 2019, 16:48 »
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials n17sm3492816wrp.37 - gsmtp')

mentre mi arriva un messaggio sul indirizzo mail di google che mi dice in parole spicciole "qualcuno sta accedendo da un app non sicura e la connessione è stata chiusa"

Forse il caso è quello indicato da  @Glenn, ma nel link postato da @papero c'è questo avvertimento :
Citazione
ATTENZIONE: a seguito dell'aggiornamento delle politiche di sicurezza di Google, per poter utilizzare quando descritto nel tutorial seguente potreste aver bisogno di aggiungere un'eccezzione per l'utilizzo di applicazioni esterne dalle impostazioni del vostro account di posta!

Una delle politicy di google è di considerare "inaffidabili" praticamente tutte le applicazioni non prodotte da lei stessa, @papero, hai definito l'accesso esterno del Tuo account gmail?
Nel caso Tu non abbia provveduto a renderlo possibile, prova a variare la politica di accesso, nel caso, forse, partendo da questa pagina potresti trovare notizie utili in merito alla Tua situazione.

14
Base / Re:Inizializzazione lista multidimensione
« il: Settembre 23, 2019, 09:24 »
Ciao :)
 intrigato dal post ho voluto provare una list comprehensions per il "dilemma" iniziale posto da @Gila, una introduzione in merito della tecnica è nel link (sono niubbo quanto lui)
>>> l = [[y+5*x for y in range(5)] for x in range(5)]
>>> l
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]

non cambia molto dal punto di vista "efficienza" ma segnalo ;)

@Caron non ti crucciare ... penso che al momento @gila miri principalmente ad apprendere come padroneggiare gli "attrezzi" di base ed acquisire una "furma mentis" adeguata a python, ripulita dei concetti ereditati da precedenti esperienze, cosa che, per altro, occorre anche a me. Passo necessario, questo, prima di procedere ad acquisire concetti e metodi "altri", per poter valutare e scegliere quali mezzi utilizzare in una propria applicazione.

Ciò non toglie che è molto interessante il Tuo esempio con numpy
>>> import numpy as np
>>> a=25
>>> b=5
>>> np.arange(a).reshape(b,b)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>>

Personalmente, non avevo neanche la definizione di "tensore" (vettore di vettori?) ma è interessante ciò che ho trovato, pur essendo lontano dal calcolo scientifico una volta soddisfatte le "basi" certamente numpy è tra le librerie da studiarsi. L'indicazione data è certamente utiissima :)

15
Esercizi / Re:Rimozione doppi caratteri stringa
« il: Settembre 17, 2019, 09:49 »
...
non capisco però questa riga di codice:
>>> ''.join(sorted(set(var), key=var.index))

...Presumo allora sia l'indirizzo d'inizio stringa.
Potreste spiegarmi ?

Pur con tutti i dubbi derivanti dalla mia ignoranza dell'inglese, cercherò di spiegare quello che ho capito io.
la funzione builtin "sorted" ha vari parametri possibili :
>>> help('sorted')
Help on built-in function sorted in module builtins:

sorted(iterable, /, *, key=None, reverse=False)
    Return a new list containing all items from the iterable in ascending order.
   
    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.

>>>

in particolare, il parametro, non obbligatorio, key definisce una funzione da utilizzarsi per ordinare gli elementi dell'oggetto iterabile passato quale primo parametro.
Nello specifico, il metodo index delle stringhe che restituisce la posizione del singolo carattere nella stringa da utilizzarsi quale criterio di ordinamento.
[Edit]Avevo omesso di dirlo : ovviamento è sorted che si fa carico di applicare la funzione ai singoli elementi dello iterabile, definendone l'ordine.
Nel caso di 'str.index(substr)' è il primo apparire del caattere nella stringa, il che va benissimo nel caso in esame[/Edit]
Quando omesso, vengono utilizzati i metodi standard previsti per l'oggetto da esaminarsi (p.e., alfabetico per oggetti stringa) ammesso che l'oggetto lo definisca,

Ne consegue che non necessariamente l'ordinamento risultante sia quello canonico per l'oggetto in esame, p.e. supposta una lista di stringhe :
>>> lista = ['d', 'ccc', 'aaa', 'bbbb', 'ee']
>>> sorted(lista)
['aaa', 'bbbb', 'ccc', 'd', 'ee']
>>>


volendola ordinare per la lunghezza delle stringhe potremmo utilizzare la funzione bultin "len() quale chiave di ordinamento
>>> sorted(lista, key=len)
['d', 'ee', 'ccc', 'aaa', 'bbbb']
>>>

ed è anche possibile utilizzare funzioni "personalizzate".

Come detto in precedenza, non necessariamente gli elementi costituenti un iterabile, tipo una lista, possiedono un criterio di ordinamento, potrebbero essere, p.e., oggetti definiti dall'utente senza definizione di criteri di comparazione, letta la Tua domanda mi son divertito a prepararti un esempio basato sui dizionari (oltre che prematuro, temo, sarebbe lungo un esempio sugli oggetti utente), posto di avere questo elenco di nomi
Paolino;Paperino
De Paperoni;Paperone
Gastone;Paperone
De Paperis;Pico
Pitagorico;Archimede

da inserirsi in una lista di paperi
>>> import os
>>> os.chdir('/media/nuzzo/progetti/digila/sorted')
>>> paperi = []
>>> f = open('nomi', 'r')
>>> for riga in f.read().splitlines():
nome = {}
data = riga.split(';')
nome['cogn'] = data[0]
nome['nome'] = data[1]
paperi.append(nome)


>>> f.close()
>>> for elem in paperi:
print(elem)


{'cogn': 'Paolino', 'nome': 'Paperino'}
{'cogn': 'De Paperoni', 'nome': 'Paperone'}
{'cogn': 'Gastone', 'nome': 'Paperone'}
{'cogn': 'De Paperis', 'nome': 'Pico'}
{'cogn': 'Pitagorico', 'nome': 'Archimede'}
>>>

la lista sarà ordinata secondo l'ordine di inserimento, se noi volessimo "ordinarla" non potremmo farlo direttamente :
>>> sorted(paperi)
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    sorted(paperi)
TypeError: '<' not supported between instances of 'dict' and 'dict'
>>>

Perché sorted non conosce il criterio di ordinamento di una serie di dizionari, dovremmo dirglielo noi. Potremmo ordinare un dizionario per chiave o valore, una lista di dizionari non ha molto senso ordinata per chiave, diciamo che vogliamo ordinarla per valore, sia il cognome od il nome, potremmo fare :
>>> for elem in sorted(paperi, key=lambda e: e['cogn']):
print(elem)


{'cogn': 'De Paperis', 'nome': 'Pico'}
{'cogn': 'De Paperoni', 'nome': 'Paperone'}
{'cogn': 'Gastone', 'nome': 'Paperone'}
{'cogn': 'Paolino', 'nome': 'Paperino'}
{'cogn': 'Pitagorico', 'nome': 'Archimede'}
>>> for elem in sorted(paperi, key=lambda e: e['nome']):
print(elem)


{'cogn': 'Pitagorico', 'nome': 'Archimede'}
{'cogn': 'Paolino', 'nome': 'Paperino'}
{'cogn': 'De Paperoni', 'nome': 'Paperone'}
{'cogn': 'Gastone', 'nome': 'Paperone'}
{'cogn': 'De Paperis', 'nome': 'Pico'}
>>>

In questo caso ho utilizzato una funzione lambda, sono possibili altre metodologie.

Spero Ti sia sufficiente :)

Pagine: [1] 2 3 ... 7