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
1
Tkinter / Re:problema con menu tkinter
« il: Oggi alle 10:37 »
sono un novizio di python ....
...
ma non funziona, inoltre come faccio se devo anche avere un return dalla funzione ?

Ciao @bot, mi perdonerai se rispondo più per fare esercizio che per dare una risposta esaustiva, la programmazione di interfacce grafiche è complessa e mi ci sono ancora avventurato poco.

Complessa è anche la risposta in merito all'argomento che poni, dipendendo in notevole misura dal design progettuale della applicazione, mio parere (gli esperti correggano) è che di per se le funzioni di callback dovrebbero limitarsi a gestire gli eventi, delegando al corpo delle funzioni di ottenere ciò che occorre ed eseguire le azioni opportune.
È opportuno, posto il "problema" progettare il proprio codice e le proprie classi in modo idoneo ad ottenere il risultato voluto tenendo presente che in sede di inizializzazione (ed anche dopo, spesso) non è che conoscano i valori dei parametri che Tu vorresti passare ... Ti ho preparato un esempio in tal senso partendo da codice recentemente postato in questo post, l'idea è semplicemente di ottenere che al comando di menu "Cerca Libro" una funzione si occupi di interrogare uno specifico oggetto per ottenere i dati inseriti nei controlli e li stampi.
Se copi il codice e lo modifichi come sotto indicato:
RIGA 71
        menu_libri.add_command(label='Cerca libro', command=self._cerca_libro)


CLASSE FinestraPrincipale - aggiugere metodo

    def _cerca_libro(self):
        if isinstance(self.sfondo, FrmLibro):
            valori = self.sfondo.dai_valori()
            print(valori)
        else:
            print('Nessun pannello libri presente')


CLASSE FrmLibro - aggiungere metodo

    def dai_valori(self):
        valori = {'autore': self.autore.get(),
                  'titolo': self.titolo.get()
                  }
        return valori

vedrai che lo farà SE starai utilizzando un pannello di classe "FrmLibro".
Sotto un output senza e con utilizzo di tale pannello (Frame, per meglio dire)
>>> %Run con_classi.py
Nessun pannello libri presente
{'autore': 'Nicola Aloia - Fausto Rabitti', 'titolo': 'SQL Sintassi e utilizzo'}


Andiamo ora ad una parte specifica del Tuo post, ossia : come inserire un parametro "variabile" nella definizione del command di un menu?

Risposta non semplice al mio (basso) livello di conoscenza (gli esperti potranno, bontà loro, integrare) , la prima domanda da porsi è : come fa l'istanza di menu a conoscere il parametro da utilizzare, , come si ottiene tale parametro?
Alla sua definizione, la funzione di callback potrà al più conoscere le variabili di classe ed istanza della classe in cui viene definita, potrà leggerli direttamente e/o  ottenerli se tali variabili sono "oggetti" grafici (widgets) riportando il discorso all'esempio prima esposto.

Comunque, diciamo che voglia "per forza" passare un "parametro" ad una funzione di callback invocata alla selezione di una voce di menu, non potrai farlo direttamente, provaci, una definizione con parametro alla definizione di un command di menu viene eseguito alla sola inizializzazione (mi si corregga se sbaglio), ma puoi ricorrere ad uno "sporco trucco" e definire una funzione lambda da richiamare al "command=...", a patto che tale "parametro" sia un oggetto conoscibile (una entry, una istanza StringVar, etc...), ciò riporta sempre alla considerazione iniziale ma voglio proporti n esempio funzionante in tal senso, è una variante all'esempio precedente (compattato ai soli "libri") che legge e richiama una funzione esterna alla classe di ricerca, in una lista di tuple, una stringa inserita nel titolo.
Il codice :

# -*- coding: utf-8 -*-

import tkinter as tk
import tkinter.messagebox as tm

libri = [('SQL Sintassi ed utilizzo', 'Nicola Aloia - Fausto Rabitti'),
         ('Core Java 2 volume 1 - Fondamenti', 'Cay S. Horstmann - Gary Cornell'),
         ('Core Java 2 volume 2 - Tecniche avanzate', 'Cay S. Horstmann - Gary Cornell'),
         ('La svastica sul sole', 'Philip K. Dick'),
         ('Universo Orbitsville', 'Bob Shaw'),
         ('scienza e coscienza', 'A.C. Bhaktivedanta Swami Pabhupada')
         ]


# *** CLASSI DELLE FINESTRE ***

class LoginFrame(tk.Toplevel):
   
    def __init__(self, master=None):
        self.master = master
        super().__init__(self.master)
        self.label_nome_utente = tk.Label(self, text="Nome Utente")
        self.label_password = tk.Label(self, text="Password")
        self.entry_nome_utente = tk.Entry(self)
        self.entry_password = tk.Entry(self, show="*")
        self.label_nome_utente.grid(row=0, sticky=tk.E)
        self.label_password.grid(row=1, sticky=tk.E)
        self.entry_nome_utente.grid(row=0, column=1)
        self.entry_password.grid(row=1, column=1)
        self.logbtn = tk.Button(self, text="Login", command=self._login_btn_clicked)
        self.logbtn.grid(columnspan=2)
        self.update()
        centra_finestra(self)
       
    def _login_btn_clicked(self):
        nome_utente = self.entry_nome_utente.get()
        password = self.entry_password.get()

        if nome_utente == "marco" and password == "password":
            self.destroy()
            self.master.mostra()
        else:
            self.master.chiudi()


class FinestraPrincipale(tk.Tk):
   
    def __init__(self):
        super().__init__()
        # configurazione
        self.title('pyLibri 0.1')
        self.geometry('960x640')
       
        f = tk.Frame(self)
        f.pack(expand=True, fill='both')
        subf1 = tk.Frame(f, padx=5, pady=5)
        subf1.pack(expand=True, fill='x', padx=5, pady=5)
        lbl1 = tk.Label(subf1, text='Titolo :', width=7, justify='left')
        lbl1.pack(side='left', anchor='n')
        self.titolo = tk.Entry(subf1, width=15)
        self.titolo.pack(side='left', expand=True, fill='x', anchor='n')
        subf2 = tk.Frame(f, padx=5, pady=5)
        subf2.pack(expand=True, fill='x', padx=5, pady=5)
        lbl2 = tk.Label(subf2, text='Autore :', width=7, justify='left')
        lbl2.pack(side='left', anchor='n', padx=5, pady=5)
        self.autore = tk.Entry(subf2, width=15)
        self.autore.pack(side='left', expand=True, fill='x', anchor='n', padx=5, pady=5)
       
        barra_menu = tk.Menu(self)
        self.config(menu=barra_menu)
        menu_libri = tk.Menu(barra_menu)
        barra_menu.add_cascade(label='Libri', menu=menu_libri)
        menu_libri.add_command(label='Nuovo libro')
        x = lambda: self._cerca_libro(self.titolo.get())
        menu_libri.add_command(label='Cerca libro', command=x)
        menu_libri.add_command(label='Cancella libro')
        menu_uscita = tk.Menu(barra_menu)
        barra_menu.add_cascade(label='Uscita', menu=menu_uscita)
        menu_uscita.add_command(label='Esci', command=self.destroy)
        self.sfondo = tk.Frame(self, padx=0, pady=0)
        self.sfondo.pack(expand=True, fill='both', padx=0, pady=0)
        self.nascondi()
        LoginFrame(self)
       
    def nascondi(self):
        ''' Nasconde la finestra.'''
        self.withdraw()

    def mostra(self):
        ''' Mostra la finestra '''
        self.deiconify()
        centra_finestra(self)
   
    def chiudi(self):
        ''' Chiude la finestra.'''
        tm.showerror("Errore", "Nome utente o password errata")
        self.destroy()
   
    def _cerca_libro(self, titolo):
        if titolo:
            print('Cerco libri con', titolo, 'nel titolo')
            risult = cerca_titolo(titolo)
            if risult:
                for libro in risult:
                    print(libro)
            else:
                print('Nessun elemento trovato')
        else:
            print('Nessun titolo inserito')
       

# *** FUNZIONI GLOBALI ****

def centra_finestra(gui):
    ''' Centra una finestra, passata come parametro, sullo schermo '''
    l = gui.winfo_screenwidth()
    a = gui.winfo_screenheight()
    wx = gui.winfo_width()
    wy = gui.winfo_height()
    gui.geometry('{}x{}+{}+{}'.format(wx, wy, (l-wx)//2, (a-wy)//2))


def cerca_titolo(titolo):
    ''' Simula una ricerca in una lista di titoli'''
    risult = []
    for libro in libri:
        if libro[0].lower().find(titolo.lower()) != -1:
            risult.append(libro)
    return risult


# *** START APPLICAZIONE ***

if __name__ == '__main__':
    app = FinestraPrincipale()
    app.mainloop()


Personalmente, non conosco o immagino metodi per ottenere un valore di ritorno alla selezione di una voce di menu.
La selezione di una voce di menu è e rimane, un evento, suo compito è scatenare azioni non restituire "risultati", sono le azioni avviate a dover produrre risultati.

Spero che ciò che credo (si correggano i miei eventuali abbagli) di aver capito ed ho cercato di esporre Ti sia utile.

2
Tkinter / Re:Tkinter e menu
« il: Marzo 13, 2019, 19:59 »

Ciao @ElTriestin, benvenuto.

È un paio di giorni  che guardo questo post, aspettando gli utenti esperti, per imparare dalla Loro risposta, dato che non si vedono oso proporre io una risposta, pur avendo fatto un solo tentativo di programmare GUI in python e presto convintomi che ho molto da imparare "prima" di ritentare.

Veniamo alla Tua domanda :
Ciao a tutti
...Suppongo di dover creare una funzione che "disegni" campi di testo e label con poi il salvataggio dei valori in una tabella MySQL (il programma già funziona in shell, anche se non mi soddisfa perchè la visualizzazione degli elenchi in shell non è pratica)

Sarà solo una mia opinabile opinione ma non credo proprio sia conveniente l'utilizzo di "funzioni" nella programmazione di interfacce grafiche, ritengo molto più indicato l'utilizzo di classi.
Vedo nel Tuo codice una tendenza alla creazione "dinamica" delle interfacce ... si può fare ma, secondo me, ci si complica la vita, in primo luogo, poi credo anche Ti renda impossibile ciò che vuoi fare : che fine fanno i widget che vorresti sostituire (faccenda implicita nella struttura) e come li trovi per gestirli?
Faccenda complessa questa, costringerebbe a tener traccia di una enormità di controlli (per testi, anagrafiche, prentazioni, etc.) e gestirli, molto meglio pensare a finestre specializzate per i vari aspetti operativi e magari una principale per la visualizzazione dei dati imho.

In ogni caso, trovo "improprio" distruggere Tk e ricrearlo, non sarebbe meglio dedicarlo alla finestra principale e nasconderlo per mostrarlo dopo il login?, quest'ultimo potrebbe essere fatto tramite una finestra Toplevel, p.e.

 ... comunque ho dedicato un'oretta a tirar fuori un esempio funzionante sulla base del Tuo codice eseguire la visualizzazione per un "Nuovo libro" (solo per titolo ed autore) facendo la relativa selezione da menu, preparato un "oggetto" per detta visualizzazione ed una funzione di classe preposta (        _carica_libro) la variante alle istruzioni da Te poste è semplicemente
        menu_libri.add_command(label='Nuovo libro', command=self._carica_libro)

il richiamo della funzione alla definizione del command

C'è un però, bisogna eliminare prima ciò che viene sostituito, guardati la classe "FinestraPrincipale" e l'uso della variabile di istanza "self.sfondo", credo che applicata alle altre "visualizzazioni" dovrebbe funzionare ... anche se personalmente eviterei di utilizzare una tale metodica.

Sotto il codice da me fatto (con le considerazioni di sopra), spero possa esserti utile

# -*- coding: utf-8 -*-

import tkinter as tk
import tkinter.messagebox as tm

# *** CLASSI DEI PANNELLI ***

class FrmLibro(tk.Frame):
    ''' Pannello dei libri.'''
   
    def __init__(self, master, *a, **k):
        super().__init__(master, *a, **k)
        self.master = master
        subf1 = tk.Frame(self, padx=5, pady=5)
        subf1.pack(expand=True, fill='x', padx=5, pady=5)
        lbl1 = tk.Label(subf1, text='Titolo :', width=7, justify='left')
        lbl1.pack(side='left', anchor='n')
        self.titolo = tk.Entry(subf1, width=15)
        self.titolo.pack(side='left', expand=True, fill='x', anchor='n')
        subf2 = tk.Frame(self, padx=5, pady=5)
        subf2.pack(expand=True, fill='x', padx=5, pady=5)
        lbl2 = tk.Label(subf2, text='Autore :', width=7, justify='left')
        lbl2.pack(side='left', anchor='n', padx=5, pady=5)
        self.autore = tk.Entry(subf2, width=15)
        self.autore.pack(side='left', expand=True, fill='x', anchor='n', padx=5, pady=5)
       

# *** CLASSI DELLE FINESTRE ***

class LoginFrame(tk.Toplevel):
   
    def __init__(self, master=None):
        self.master = master
        super().__init__(self.master)
        self.label_nome_utente = tk.Label(self, text="Nome Utente")
        self.label_password = tk.Label(self, text="Password")
        self.entry_nome_utente = tk.Entry(self)
        self.entry_password = tk.Entry(self, show="*")
        self.label_nome_utente.grid(row=0, sticky=tk.E)
        self.label_password.grid(row=1, sticky=tk.E)
        self.entry_nome_utente.grid(row=0, column=1)
        self.entry_password.grid(row=1, column=1)
        self.logbtn = tk.Button(self, text="Login", command=self._login_btn_clicked)
        self.logbtn.grid(columnspan=2)
        self.update()
        centra_finestra(self)
       
    def _login_btn_clicked(self):
        nome_utente = self.entry_nome_utente.get()
        password = self.entry_password.get()

        if nome_utente == "marco" and password == "password":
            self.destroy()
            self.master.mostra()
        else:
            self.master.chiudi()


class FinestraPrincipale(tk.Tk):
   
    def __init__(self):
        super().__init__()
        # configurazione
        self.title('pyLibri 0.1')
        self.geometry('960x640')
        barra_menu = tk.Menu(self)
        self.config(menu=barra_menu)
        menu_libri = tk.Menu(barra_menu)
        barra_menu.add_cascade(label='Libri', menu=menu_libri)
        menu_libri.add_command(label='Nuovo libro', command=self._carica_libro)
        menu_libri.add_command(label='Cerca libro')
        menu_libri.add_command(label='Cancella libro')
        menu_soci = tk.Menu(barra_menu)
        barra_menu.add_cascade(label='Soci', menu=menu_soci)
        menu_soci.add_command(label='Nuovo socio')
        menu_soci.add_command(label='Cerca socio')
        menu_soci.add_command(label='Cancella socio')
        menu_prenotazioni = tk.Menu(barra_menu)
        barra_menu.add_cascade(label='Prenotazioni', menu=menu_prenotazioni)
        menu_prenotazioni.add_command(label='Nuova prenotazione')
        menu_prenotazioni.add_command(label='Cerca prenotazione')
        menu_prenotazioni.add_command(label='Cancella prenotazione')
        menu_uscita = tk.Menu(barra_menu)
        barra_menu.add_cascade(label='Uscita', menu=menu_uscita)
        menu_uscita.add_command(label='Esci', command=self.destroy)
        self.sfondo = tk.Frame(self, padx=0, pady=0)
        self.sfondo.pack(expand=True, fill='both', padx=0, pady=0)
        self.nascondi()
        LoginFrame(self)
       
    def nascondi(self):
        ''' Nasconde la finestra.'''
        self.withdraw()

    def mostra(self):
        ''' Mostra la finestra '''
        self.deiconify()
        centra_finestra(self)
   
    def chiudi(self):
        ''' Chiude la finestra.'''
        tm.showerror("Errore", "Nome utente o password errata")
        self.destroy()
   
    def _carica_libro(self):
        self.sfondo.destroy()
        self.sfondo = FrmLibro(self, padx=0, pady=0)
        self.sfondo.pack(expand=True, fill='both', padx=0, pady=0)
       
       

# *** FUNZIONI GLOBALI ****

def centra_finestra(gui):
    ''' Centra una finestra, passata come parametro, sullo schermo '''
    l = gui.winfo_screenwidth()
    a = gui.winfo_screenheight()
    wx = gui.winfo_width()
    wy = gui.winfo_height()
    gui.geometry('{}x{}+{}+{}'.format(wx, wy, (l-wx)//2, (a-wy)//2))

# *** START APPLICAZIONE ***

if __name__ == '__main__':
    app = FinestraPrincipale()
    app.mainloop()


3
Base / Re:Compilare campi cedola da stampare
« il: Marzo 01, 2019, 12:14 »
Esiste un software con il quale posso misurare esattamente le coordinate di un file immagine su cui poi scrivo?

Intendi un programma qualsiasi per ottenere le coordinate iniziali in cui inerire del testo in una immagine?

Per tale scopo potrebbe essere utile GIMP, un programma di foto-ritocco, scorrendo col mouse su di una immagine nella finestra sono presenti le coordinate correnti del cursore, che possono essere espresse in varie modalità, tra cui pixel (unità base per le immagini) e punti (unità base per i fonts).

In merito alla "precisione", cosa intendi?

4
Database / Re:Somma di alcune colonne
« il: Febbraio 28, 2019, 16:50 »
I miei saluti.

Anche se un po' prematuramente, ho cominciato a vedere qualcosa dei db in python e quasi immediatamente mi sono imbattuto nella pep 249, "Python Database API Specification 2.0", che definisce le specifiche cui devono attenersi i drivers python per le varie basi dati.

Pur se penso che lo OP abbia ormai risolto la sua ultima domanda (cui ho risposto in maniera scherzosa), nel leggere la docs ho visto un particolare secondo me pertinente con la discussione che penso sia il caso di segnalare, altri apprendisti come me potrebbero giovarsene.

Il "particolare" è che un oggetto "cursor" deve esporre dei dati descrittivi del result-set definito dalla query ... a prima vista, ciò "non sembra" particolarmente indicativo, infatti esso espone una serie di tuple contenenti, tra l'altro, il nome della colonna ovvero la funzione applicata su di una colonna, sotto un esempio relativo alla query di interrogazione di base a questo post :

>>> curr = conn.cursor()
>>> curr.execute("""
SELECT nome, SUM(val1), SUM(val2), SUM(val3)
FROM totascio
GROUP BY nome
""")
>>> c_data = curr.description
>>> c_data
(Column(name='nome', type_code=1043, display_size=None, internal_size=10, precision=None, scale=None, null_ok=None), Column(name='sum', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None), Column(name='sum', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None), Column(name='sum', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None))


vi è però l'istruzione sql "AS" che ci permette di denominare "diversamente" un dato od una aggregazione di dati restituita, supposto di voler denominare le somme delle colonne in esempio quali "somma_1 ... somma_n" potremmo porre la query

>>> curr.execute("""
SELECT nome, SUM(val1) AS somma_1, SUM(val2) AS somma_2, SUM(val3) AS somma_3
FROM totascio
GROUP BY nome
""")


una tale query ci permetterebbe di estrarre la descrizione "come vorremmo" che sia definita, in maniera semplice

>>> tv_data = curr.description
>>> c_name = []
>>> for elem in tv_data:
c_name.append(elem[0])


>>> c_name
['nome', 'somma_1', 'somma_2', 'somma_3']


la qual cosa permetterebbe, appoggiandosi ad una variabile intermedia, p.e. una lista, di definire le "tuple" richieste dallo OP

>>> my_data = []
>>> for row in curr.fetchall():
nome, uno, due, tre = row
r_data = [nome, (c_name[1], uno), (c_name[2], due), (c_name[3], tre)]
my_data.append(r_data)

>>> for elem in my_data:
print(elem)


['pippo', ('somma_1', 13), ('somma_2', 12), ('somma_3', 13)]
['ciccio', ('somma_1', 2), ('somma_2', 1), ('somma_3', 10)]
['nino', ('somma_1', 4), ('somma_2', 2), ('somma_3', 1)]
>>>


... certamente si può far di meglio (agli esperti battere il colpo) ma mi sembra un metodo "pratico" per il risultato voluto, oltre quello di definire manualmente dati che si conoscono già, non credo sia il caso di andarsi ad esaminare il "vocabolario" di un db con metodi specifici.

Personalmente, vedo cursor.description utile per eventuali intestazioni di visualizzazioni tabellari dei dati.

5
Ciao a tutti  :) Qualcuno gentilmente potrebbe aiutarmi? Sono agli inizi con Python  :embarrassed:
...
Magari è una cavolata :embarrassed:, ma non ho esercizi svolti da cui poter prendere spunto o farmi anche un'idea e sono agli inizi dello studio.

Se qualcuno volesse darmi anche solo un piccolo aiutino… Grazie anticipatamente  :) Ciao!

Ciao

Premetto che per Tua convenienza è opportuno, prima di chiedere aiuto, provarci, innanzi tutto acquisendo le nozioni necessarie a fare una ipotesi di lavoro e provare a realizzarla, san google aiuta molto a trovare informazioni tipo questa sul leggere/scrivere files di testo, oppure sulle strutture dati disponibili in python.
Dico ciò perché, per esperienza diretta, il non affrontare direttamente il problema inibisce l'assimilazione dei concetti che serve acquisire, fidati, "mettersi" vale 100 volte il "suggerito".

Detto questo, stai ponendo la richiesta di aiuto senza indicare assolutamente nulla, tipo :
- come sono strutturati i file dati da leggere?
- cosa è, esattamente, che devi farci?
Comprenderai che esistono "milioni" di approcci diversi possibili, dipendentemente dalle circostanze.

Ti segnalo, ed invito, a leggere le linee guida per porre compiutamente una richiesta di aiuto, comprendo che Tu sia all'inizio e non le conosca.

Un modo, semplice, per leggere dati da un file di testo lo ho indicato in un recente post, come esempio potrebbe andar bene, vedi un po' se Ti è di aiuto.

Per altro, provaci, poi se hai problemi si è qui. :)

6
if attivo:
IndentationError: unindent does not match any outer indentation level

lo dice l'errore stesso : è dovuto ad errata indentazione.

Python ha una caratteristica peculiare di gestire l'annidamento del codice : utilizza l'indentazione.
Ne consegue, nel codice da Te esposto, che il "continue" invoca un blocco di indentazione che non è stato definito. Dovresti de-indentare di un livello tanto quel continue quanto il blocco "if attivo" e codice seguente, così com'è non dovrebbe funzionare correttamente. Fai molta attenzione alle indentazioni.

Un suggerimento per futuri post : crea un blocco per il codice premendo il pulsante "pythoncode" nella bottoniera ed inserisci il codice tra i tag che vengono generati, sarà molto più chiaro da leggere ed ordinato.

buon lavoro :)

[Edit] Concentrato sull'errore non me ne ero reso conto di :
Citazione
Ora sto provando a leggere salvare in dati = [] anche la riga che contiene la stringa "data".
Così funziona, certo ma ... ripristina com'era e prova ad eliminare proprio il "continue" dal codice, vedi quindi che succede ... Ti servirà ;)

7
Base / Re:Installazione modulo Openpyxl
« il: Febbraio 08, 2019, 08:37 »
Se posso dare una segnalazione, non saprei quanto efficace per il mac

Ho avuto un analogo problema un paio di mesi fa installando le wxPython sul mio sistema linux, ricevevo questo errore :

:~$ pip3 install --user wxPython
Traceback (most recent call last):
File "/usr/local/bin/pip3", line 7, in <module>
from pip._internal import main
ModuleNotFoundError: No module named 'pip._internal'

l'errore era comune, ad ogni tentativo d'uso per installazione di pacchetti, tanto al pip della versione 2.x quanto per la versione 3.x, coesistenti come da default.

dopo alcune ricerche ho risolto scaricando il file get-pip.py da https://bootstrap.pypa.io/get-pip.py e facendo una re-installazione forzata del pip, questo l'output

:~$ sudo python3 get-pip.py --force-reinstall
The directory '/home/nuzzo/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/nuzzo/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pip
Downloading https://files.pythonhosted.org/packages/c2...y3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 172kB/s
Installing collected packages: pip
Found existing installation: pip 9.0.1
Uninstalling pip-9.0.1:
Successfully uninstalled pip-9.0.1
Successfully installed pip-18.1


dalla reinstallazione forzata l'installazione dei pacchetti tramite pip funziona tanto per la versione 2.x quanto per la 3.x di python.

Provando i virtualenv ho visto che torna in auge il pip 9.0.1 sostituito e viene l'errore alla installazione di pacchetti in virtualenv, ogni volta mi tocca reinstallare il pip nel virtualenv.

Ovviamente chiedo ai più esperti di esprimere parere in merito :
suggerirei allo OP di provare in un virtualenv il sistema sopra adottato (in maniera da lasciare integro il sistema base) e vedere se con tale metodo la funzionalità del pip viene ripristinata ... va da se che in un virtualenv non vi è bisogno di re-installazione da superutente.

8
Non hai capito. Se non conosci l'encoding di un file, non è che python possa conoscerlo al posto tuo. Non è un problema di python. La dua domanda...
Ma dai, mai imputato a python niente, su questi concetti c'ero arrivato, guarda la premessa iniziale :)
Citazione
So benissimo che la codifica del testo proveniente da fonti sconosciute è una rogna "secolare"
Ciò non toglie che la mia ignoranza possa essere una rogna ancora peggiore, pur se non ho trovato in risposta librerie con capacità divinatorie le rfc segnalate da @riko mettono ME in condizione di rispettarle, già chiariscono che lo utf-8 che io credevo valido, non è opportuno e sarebbe meglio la codifica ascii, non parliamo, poi, del "cr-lf".

A pensarci bene, questo aspetto potrei anche considerarlo "risolto", metterò indicazione in tal senso pur senza voler minimamente sfuggire ad apprezzati interventi ... e rimproveri ;)

...  Poi certo, visto che *adesso* menzioni la possibilità di produrre "caratteri strani", credo che tu ti riferisca alla possibilità di settare il parametro "errors" di open https://docs.python.org/3/library/functions.html#open, cosa che è sempre un rifugio possibile... ma questo non è certamente "indovinare l'encoding". 

Ecco! La "vera" utilità di queste discussioni, con queste brevi righe hai evidenziato qualcosa che non ho compreso malgrado abbia "letto" (ma "capito" poi?) e che mi farà tornare a leggere. Comunque, a volte, può essere sufficiente "avere il grosso", non è sempre necessaria la perfezione.
In merito alla codifica "ISO-8859-1" è solo la prima della scaletta che normalmente uso (poi ISO-8859-15 e windows-1252), tra le poche imparate "a memoria" e spesso sufficienti per i miei piccoli script.

...Ma lo hai *davvero* provato?
Come detto : giochicchiato, se guardi qui vi troverai uno dei miei primi giochetti, noterai che mi riconosco inadeguato e, per me e le mie capacità correnti, rimane "utile ma non troppo", malgrado siano passati un paio di anni.

In ogni caso, non posso dire di aver *davvero* provato niente in python, tutt'ora se mi trovo costretto (per quanto posso, evito) a dover fare "qualcosa" ricorro ad altri linguaggi, tempo permettendo (brutto tiranno) ed ignoranza (perfida megera) consentendo sono un forno a fuoco lento e non mi ci sono misurato ... magari tra un ano o due ...
Ovviamente, considero gli script di utilità immediata come "niente".

Precisato quanto sopra (il "sono qui per imparare" della mia presentazione), grazie dei link, li avevo già trovati entrambi ma è sempre utile averli a portata di mano.
:)

9
Sì ma al di là di questo non capisco dove risiede concretamente il problema....

Problema? No, certamente, seccatura al più, almeno quando ti capita una urgenza e devi perderci su un po' di tempo a tirare a indovinare quale set caratteri è stato usato ... niente di che, comunque.
La maggior parte dei casi "seccanti" capitano quando un dirigente ti porta un file reperito chissà dove e vuole i dati puliti e in linea nel database per ieri ... hai voglia a chiedere dell'encoding, il 90% degli interlocutori non l'ha mai sentito nominare! ;)

Giustissimo quel che dici sul testo "puro", già capitato più volte e conoscevo chardet da un po', fa anche parte della libreria python fornita nella mia distribuzione (non so se è presente nella standard), ci ho anche giochicchiato un po', come detto prima "utile ma non troppo", strumento discreto per cercare di "indovinare" ma non è che faccia miracoli, comunque aiuta.

La mia domanda è motivata dalla constatazione di quanto sia estesa la libreria python e di quanto Voi la conosciate più di me, sai mai ci sia una utilità che ti apre comunque un file di testo (magari con qualche carattere strano), domandare non è certo la fine del mondo.
... in ogni caso, utilità che magari ci si può anche costruire da soli.

10
CSV e' il farwest.

Già ... La vita è fatta per soffrire!

Ci sarebbe pure uno standard (https://www.ietf.org/rfc/rfc4180.txt), ma e' noto che di fatto ognuno fa un po' il ca**o che gli pare e lo standard (postumo) lo dice pure.

Grazie della indicazione, leggerò :)

11
Ciao @Claudia.

È da ieri che osservo questo post e non vedo risposte. Non me ne stupisce, data la domanda sin troppo vaga e che puo dar origine a numerose varianti sul tema ... in sostanza contrasta pienamente con le linee guida di questo forum, che Ti invito a leggere, come sono stato invitato a fare a mia volta.

Perdonabile svista, per un primo post.
Dato che nessuno degli utenti esperti si è sin ora espresso, provero io a dare qualche indicazione, pur essendo uno degli ultimi "acquisti" e, credo, uno dei più scarsi componenti del forum.

Andiamo sulla Tua domanda :
Citazione
Nei csv la parte di file di mio interesse inizia con una riga che contiene  la stringa ' Data'  ma purtroppo  questa riga è in una posizione diversa a seconda del file csv

Premetto che in python, nella libreria base, è presente la libreria "csv" che certamente può esserti utile ma che personalmente snobbo un po', preferendo la libertà di trattare direttamente con testo e liste, nel caso da Te posto, leggere i dati a partire da un particolare contenuto, ti faccio un semplice esempio; posto un file "nomi.csv ", con questo contenuto :

COGNOME;NOME;DATA_NASCITA
De Paperoni;Paperon;1901-01-01
Paperino;Paolino;1950-11-01
Paperone;Gastone;1950-01-06
 Data;;
Mouse;Miky;1900-02-29
Mouse;Minnie;1910-01-01
Mucca;Clarabella;1923-12-13


per leggere solo i dati successivi al ' Data', farei così:

>>> f = open('nomi.csv', 'r')
>>> elenco = f.read().splitlines()
>>> f.close()
>>> attivo = False
>>> dati = []
>>> for riga in elenco:
riga_dati = riga.split(';')
if ' Data' in riga_dati:
attivo = True
continue
if attivo:
dati.append(riga_dati)


>>> dati
[['Mouse', 'Miky', '1900-02-29'], ['Mouse', 'Minnie', '1910-01-01'], ['Mucca', 'Clarabella', '1923-12-13']]
>>>

ed utilizzerei la lista di liste "dati" per le successive operazioni.

Va da se che un eventuale ciclo tra vari files "csv" lo farei estraendo, a sua volta, l'elenco dei files da una directory che li contiene, il modulo blob è comodo per tal fine:
>>> import glob
>>> lista_csv = glob.glob('my_tmp/test/pyt/prove/*.csv')
>>> lista_csv
['my_tmp/test/pyt/prove/indirizzi.csv', 'my_tmp/test/pyt/prove/nomi.csv']
>>>


Ora veniamo al punto cruciale
Citazione
file csv che devo importare come dataFrame in python.
Cosa intendi per "Data-frame"? ,,, a quanto ne so, un data-frame dovrebbe essere una struttura per rappresentare un insieme di dati di varia natura ,,, per tale rappresentazione, in python, si prestano bene tanto le liste dell'esempio prima quanto le tuple ... dizionari ed insiemi magari anche, per usi un po' più particolari.

Ora, la circostanza che hai scritto il post nella sezione "database" fa sorgere l'ipotesi Tu possa magari volere qualcosa d'altro, tipo importare dati in un database, converrebbe chiarissi questo punto (si possono importare direttamente i csv in molti db), assieme a quali sono le Tue effettive difficoltà e le caratteristiche presenti nei csv che devi trattare, la variabilità da Te indicata è tutt'altro che comune e per poter fare qualcosa di utile bisogna sapere le condizioni di partenza e quelle da ottenersi all'arriv.

Ciao

[Edit] Sono andato a fare una ricerca "data frame in python", ed ho trovato "Python Pandas - DataFrame" ... che non sarebbe altro che una rappresentazione dati per righe e colonne ... ah beh, se serve ...
È ciò che cerchi?

12
Salute a Voi.

Come da oggetto, per necessità lavorative mi serviva associare luogo, sesso e data di nascita a nominativi cui disponevo solo del codice fiscale, ho risolto "al volo" con un piccolo script dopo essermi scaricato il csv di codifica dei comuni italiani dal  sito dell'istat (se interessano tali dati l'indirizzo è : http://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.csv)

Un intoppo avuto al primo utilizzo del file è stato causato dalla conversione in utf-8 che falliva, risolto sbrigativamente immaginandolo di provenienza windows ed impostando una codifica 'ISO-8859-1' nell'apertura del file.

So benissimo che la codifica del testo proveniente da fonti sconosciute è una rogna "secolare" ma mi chiedo se tra le sterminate librerie di python ve ne è qualcuna in grado di dar soluzione al problema o, quanto meno, una convenzione in merito.
Da precedenti ricerche mi ero convinto che i files csv "dovessero" essere in codifica utf-8 ... ma pare che l'istat non concordi sulla cosa.

P.S. - tempo fa trovai chardet nelle librerie python, utile ma non troppo.

13
Base / Re:Creare script da eseguire su terminale con setuptools
« il: Febbraio 01, 2019, 13:11 »
cosi ho risolto quasi tutti i problemi, l'unica cosa che non riesco a risolvere è che per eseguire lo script ( mettiamo caso si chiami compression.py) devo scrivere nel terminale compression.py, mentre dovrei poter scrivere solo compression [file] ecc... un pò come i comandi unix. come potrei risolvere ? grazie mille !

È necessario che il file di script abbia l'estensione?
Essendo null'altro che un file di testo interpretato credo possa anche non esserci alcuna estensione nel nome del file, python se lo mastica comunque ... appena provato nel mio sistema ed è proprio così, vedi giù

NzP:~$ cp inv_cf.py inv_cf
NzP:~$ python3 inv_cf
Codice fiscale :
NzP:~$

l'estensione del file è sostanzialmente una "utilità", non una necessità (tra parentesi ero venuto proprio per lumi su di una particolarità derivata da quel file di codice :) )

@bebo, interessante la Tua indicazione, non la conoscevo (ovviamente) e nemmeno immaginavo qualcuno avesse codificato una libreria per gestire i parametri di una chiamata ...

14
Base / Re:Creare script da eseguire su terminale con setuptools
« il: Gennaio 31, 2019, 19:54 »
Ciao  :)

[Spero di non aver frainteso completamente la richiesta]

Certamente gli utenti più esperti sapranno dare indicazioni molto più efficaci, ma un metodo molto semplice è utilizzare il modulo "sys" per leggersi i parametri passati allo script.
Stabilendo, p.e., che il primo di tali parametri sia la funzione da richiamare ed i successivi quelli da "utilizzare" ... ti posto un semplice esempio, fatto al volo, supposto uno script "test.py" così costituito:
# -*- coding: utf-8 -*-

import sys


def get_numero(strnum):
    try:
        return int(strnum)
    except ValueError:
        try:
            return float(strnum)
        except ValueError:
            pass
    return None

def vedi_numero(strnum):
    num = get_numero(strnum)
    if num:
        print('Hai inserito il numero', num)
    else:
        print(strnum, 'mica è un numero!')


def leggi_testo(parole):
    print('Ricevuto:')
    for p in parole:
        print(p, end=' ')
    print()


if __name__ == '__main__':
    param = sys.argv
    if len(param) < 3:
        print('Utilizzo : python test.py nome_funzione parametro1 ... [parametro n]')
        exit()
    if param[1] == 'vedi_numero':
        vedi_numero(param[2])
    elif param[1] == 'leggi_testo':
        parole = param[2:]
        leggi_testo(parole)
    else:
        print('Funzione', param[1], 'non supportata')


sarà possibile richiamare, a scelta la funzione "vedi_numero()" (con un ulteriore parametro) o "leggi_testo()" (con una lista di parametri),output di esempio.
Ovviamente, la "scelta" viene effettuata nel blocco istruzioni di "if __name__ == '__main__':"

Un esempio di esecuzione:

NzP:~$ python3 test.py vedi_numero 125
Hai inserito il numero 125
NzP:~$ python3 test.py vedi_numero 12.5
Hai inserito il numero 12.5
NzP:~$ python3 test.py vedi_numero 12,5
12,5 mica è un numero!
NzP:~$ python3 test.py leggi_testo Apelle figlio di Apollo
Ricevuto:
Apelle figlio di Apollo
NzP:~$ python3 test.py leggi_numero 125
Funzione leggi_numero mom supportata

15
Database / Re:Somma di alcune colonne
« il: Gennaio 25, 2019, 18:06 »
Rispondi da cellulare.

Si, ė possibile estrarre i nomi dei campi ma bisognerebbe un po' vedere.

Ciò che mi chiedo ė a cosa ti serva, dato che li conosci già (li hai inseriti nella query) basta manipolare il print.

[Edit] ora sono al computer, Su postgresql farei così :
sql = "SELECT nome, 'Maremma : ' || SUM(Rimarc_Primaria_Gialla)::int as test,\
'Bucaiola : ' || SUM(Rimarc_Secondaria_Gialla)::int as test,\
SUM(Rimarc_Doppia_Gialla) FROM allevatore GROUP BY nome"


Appena testata sullo 8-3 in macchina virtuale, purtroppo non posso postarne l'output, ma va ... in altri sistemi db  : manuali! ;)

N.B - corretta la query, avevo mischiato voci mie con quelle di @tascio.

Pagine: [1] 2 3