Python creare file da un file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
jazz_mc96
Prode Principiante
Messaggi: 3
Iscrizione: domenica 12 giugno 2016, 8:50
Sesso: Maschile

Python creare file da un file

Messaggio da jazz_mc96 »

Salve a tutti, da quest' anno ho iniziato ad utilizzare Python sotto consiglio del prof (che mi ha assegnato dei progettini) dato che volevo capire più o meno cosa significasse programmare.
Comunque il mio problema è questo: devo gestire un file molto lungo, e avevo pensato di dividerlo in file più piccoli; come faccio?
Mi spiego meglio, ho un file lungo tipo 30 000 e passa righe e avevo pensato di dividerlo in file da 5 000 righe, ossia le prime 5 000 righe in un primo file, le successive 5000 righe in un secondo file e cosi via.
Inoltre avevo intenzione di chiamare i nuovi file con lo stesso nome del file originale ma seguiti da un numero; cioè tipo il primo file lo vorrei chiamare titolo_1, il secondo titolo_2, e cosi via.
Grazie in anticipo a chiunque mi potrà aiutare :)
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python creare file da un file, aiuto!!

Messaggio da Claudio_F »

jazz_mc96 ha scritto:Comunque il mio problema è questo: devo gestire un file molto lungo, e avevo pensato di dividerlo in file più piccoli; come faccio?
Il problema è il procedimento da seguire o come realizzarlo con Python? Come premessa sai leggere sequenzialmente un file di testo? Visto che parli di righe si immagina che sia un file di testo. Sai scrivere delle righe in un file di testo? Conteggiare quelle scritte per decidere se tenere aperto il file in scrittura o chiuderlo e aprire il prossimo?

Per quanto riguarda il nome può essere di aiuto os.path.splitext del modulo os che separa nome da estensione:

Codice: Seleziona tutto

import os
name, ext = os.path.splitext(file_name)
Per comporre un nuovo nome basta usare un contatore di file (che parte da 0 e da incrementare ad ogni nuovo file) e creare una nuova stringa usando il suo valore (magari usando la formattazione di stringa):

Codice: Seleziona tutto

new_name = '%s_%04d%s' % (name, numfile, ext)
jazz_mc96
Prode Principiante
Messaggi: 3
Iscrizione: domenica 12 giugno 2016, 8:50
Sesso: Maschile

Re: Python creare file da un file, aiuto!!

Messaggio da jazz_mc96 »

si è un file di testo costituito da brevi frasi.
avevo pensato di trattare l 'intero file come una lista che presenta come argomenti le varie righe.
scompongo questa mia lista iniziale in liste più piccole, quindi lista 1 è costituita dai primi 5000 argomenti, lista 2 dai successivi 5000 ecc. e infine da ogni lista ottenuta creo il rispettivo file.
Tutto sommmato dato che il file è costituiro da circa 30 000 righe e quindi la lista iniziale dovrebbe avere 30 000 argomenti, creando 6/7 liste ce la dovrei fare; pero dovrei fare questo lavoro anche per altri file.
Quindi anche se questa potrebbe essere un modo , ne sto cercando uno migliore.
Provo a sbatterci ancora un po la testa, provando ad utilizzare while, che forse mi potrebbe servire
Per quanto riguarda invecei nomi dei file ok provero cosi.
Grazie mille comunque
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python creare file da un file, aiuto!!

Messaggio da Claudio_F »

Vabbè che oggi come oggi su un PC occupare 5..10MB di memoria per i dati non è un problema, però è possibile leggere una riga alla volta con un semplice for contando le righe:

Codice: Seleziona tutto

count = 0
for line in open('NOMEFILE.TXT', 'r'):
    count += 1
    if count > qualcosa:
        count = 1
        ...operazioni...
    ...fa qualcosa con line...
Per quanto riguarda il trattare più file basta scrivere il tutto come una funzione generale, che accetti ad esempio nome file e numero righe dei blocchi, definita ad esempio così:

Codice: Seleziona tutto

def split_text_file(file_name, num_rows):
Così si possono trattare tutti i file in un colpo solo:

Codice: Seleziona tutto

d = (  ('file_a.txt', 5000),
       ('file_b.txt', 6000),
       ('file_c.txt', 3000)  ) 

for file_name, rows in d:
    split_text_file(file_name, rows)
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Python creare file da un file

Messaggio da rai »

Dato che il solito embargo dei suggerimenti per i compiti da fare a casa in questo caso non si applica, approfitto per aggiungere due domande
tralascio la questione di nomefile ed estensione curata da Claudio_F

è meno efficiente fare così? e se sì dove?

Codice: Seleziona tutto

def splitFile(largeFile="path/del/file", N_righe=5000):
    """divide largeFile in tanti file di N_righe righe
    quanti ne servono per contenere tutte le righe di largeFile
    """
    with open(largeFile, 'r') as f:
	    var = f.readlines()
	    lungh = len(var)
	    suffix = 1
	    start = 0
	    for step in range(N_righe, lungh+N_righe, N_righe):
		    end = step > lungh and lungh or step
		    with open("{}_{}".format(largeFile, str(suffix)), 'w') as f1:
			      f1.writelines(var[start:end])
			      suffix +=1
			      start = end
le righe sono 30000 e sono piccole: in questo caso può essere utile un generatore che passi una riga alla volta?
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python creare file da un file

Messaggio da Claudio_F »

rai ha scritto:è meno efficiente fare così? e se sì dove? le righe sono 30000 e sono piccole: in questo caso può essere utile un generatore che passi una riga alla volta?
Per come è strutturato il codice, un generatore mi sembra inutile visto che comunque si è già letto in blocco l'intero file. Potrebbe "forse" servire per fornire già blocchi completi fino a N righe (ma si spezza solo l'algoritmo in due parti). Come lo intendevi?

Per quanto riguarda l'efficiente, in che senso? Velocità? Memoria?

Poi le possibili soluzioni sono molte, compresa questa esotica e forse inefficientissima:

Codice: Seleziona tutto

import os
r = 5000
file_name = 'NOMEFILE'
name, ext = os.path.splitext(file_name)
data = open(file_name, 'rb').readlines()
ch = [data[i:i+r] for i in range(0, len(data), r)]
fi = [open('%s_%04d%s'%(name, i, ext), 'wb') for i in range(len(ch))]
[fh.writelines(li) for (fh, li) in zip(fi, ch)] + [fh.close() for fh in fi]
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Python creare file da un file

Messaggio da rai »

Per come è strutturato il codice, un generatore mi sembra inutile visto che comunque si è già letto in blocco l'intero file. Potrebbe "forse" servire per fornire già blocchi completi fino a N righe (ma si spezza solo l'algoritmo in due parti). Come lo intendevi?
No infatti in quel caso farei a meno di creare la lista di millamila elementi
per es. userei una funzione che yieldi le porzioni del fileGrande sotto forma di generatore da cui ciclare le righe da scrivere; scusa non ho il codice da postare
Per quanto riguarda l'efficiente, in che senso? Velocità? Memoria?
Scusa la superficialità, mi riferivo in modo teorico sia all'una che all'altra. Ma forse non solo in modo teorico se si ha a che fare con file e linee molto più pesanti
Grazie
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Python creare file da un file

Messaggio da crap0101 »

aggiungo che se non è importante avere l'identico numero di linee in tutti i file (tranne l'ultimo magari) il metodo readlines accetta un argomento opzionale (size) con cui si può dividere più comodamente il file.

una cosa del genere (non l'ho provato):

Codice: Seleziona tutto

import os
import sys

with open(sys.argv[1]) as f:
    size = int(sys.argv[2])
    destdir = os.path.abspath(sys.argv[3])
    n = 1
    while True:
        lines = f.readlines(size)
        if not lines:
            break
        with open(os.path.join(destdir, 'out_%d' % n), 'w') as o:
            o.writelines(lines)
        n += 1
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
jazz_mc96
Prode Principiante
Messaggi: 3
Iscrizione: domenica 12 giugno 2016, 8:50
Sesso: Maschile

Re: Python creare file da un file

Messaggio da jazz_mc96 »

grazie mille !!!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti