2015-06-23 20 views
6

Sto cercando un aiuto con il mio codice, che è rigth di seguito:Le differenze tra enumerate (fileinput.input (file)) ed enumerare (file)

for file in file_name : 
    if os.path.isfile(file): 
     for line_number, line in enumerate(fileinput.input(file, inplace=1)): 
      print file 
      os.system("pause") 
      if line_number ==1: 
       line = line.replace('Object','#Object') 
       sys.stdout.write(line) 

ho voluto modificare alcuni file estratti precedenti ordine di tracciarli con matplotlib. Per fare ciò, rimuovo alcune linee, commentane altre.

Il mio problema è il seguente:

  • Utilizzando for line_number, line in enumerate(fileinput.input(file, inplace=1)): mi da solo 4 su 5 precedenti file estratti (quando si cerca lista nome_file contiene 5 referenze!)

  • Utilizzando for line_number, line in enumerate(file): mi dà la 5 precedente file estratto, MA non so come apportare modifiche utilizzando lo stesso file senza crearne un altro ...

Hai avuto un'idea su questo problema? È un problema normale?

+0

Non so perché non appare, ma all'inizio manca un "Ciao ragazzi" .. prova a modificarlo ma sembra che non appaia. – flor14n

+0

L'overflow dello stack toglie automaticamente i saluti in quanto non pertinenti alla domanda. –

+0

Potrebbe definire "nome_file" all'inizio del codice. – PythonTester

risposta

2

C'è un numero di cose che potrebbero aiutarti.

In primo luogo file_name sembra essere un elenco di nomi di file. Potrebbe essere meglio chiamato file_names e quindi è possibile utilizzare file_name per ciascuno. Hai verificato che questo contiene 5 voci.

La funzione enumerate() viene utilizzata per facilitare l'enumerazione di un elenco di elementi per fornire sia un indice che l'elemento per ciascun ciclo. Ciò ti evita di dover utilizzare una variabile contatore separata, ad es.

for index, item in enumerate(["item1", "item2", "item3"]): 
    print index, item 

sarebbe stampare:

0 item1 
1 item2 
2 item3 

questo non è davvero necessario, come si è scelto di utilizzare la libreria fileinput. Questo è progettato per prendere una lista di file e iterare su tutte le linee in tutti i file in un unico ciclo. Come tale è necessario modificare il vostro approccio un po ', supponendo che l'elenco dei file si chiama file_names allora si scrive qualcosa come segue:

# Keep only files in the file list 
file_names = [file_name for file_name in file_names if os.path.isfile(file_name)] 

# Iterate all lines in all files 
for line in fileinput.input(file_names, inplace=1): 
    if fileinput.filelineno() == 1: 
     line = line.replace('Object','#Object') 
     sys.stdout.write(line) 

Il punto principale è che è meglio di controllare la validità del filtro eventuali non nomi di file prima di passando la lista a fileinput. Lascerò a te decidere l'output.

fileinput fornisce una serie di funzioni per aiutarti a capire quale file o numero di linea è attualmente in fase di elaborazione.

+0

Grazie per la risposta darò un'occhiata a questo! – flor14n

0

Supponendo che tu stia ancora avendo problemi, il mio approccio tipico è aprire un file di sola lettura, leggere il suo contenuto in una variabile, chiudere il file, creare una variabile edited, aprire il file da scrivere (cancellare il file originale), e infine scrivere i contenuti di edited.

Mi piace questo approccio poiché posso semplicemente modificare il file nome che viene scritto se voglio testare le mie modifiche senza cancellare il file originale.

Inoltre, consiglio di denominare i contenitori utilizzando nomi plurali, come suggerisce @Martin Evans.

import os 

file_names = ['file_1.txt', 'file_2.txt', 'file_3.txt', 'file_4.txt', 'file_5.txt'] 
file_names = [x for x in file_names if os.path.isfile(x)] # see @Martin's answer again 

for file_name in file_names: 
    # Open read-only and put contents into a list of line strings 
    with open(file_name, 'r') as f_in: 
     lines = f_in.read().splitlines() 

    # Put the lines you want to write out in out_lines 
    out_lines = [] 
    for index_no, line in enumerate(lines): 
     if index_no == 1: 
      out_lines.append(line.replace('Object', '#Object')) 
     elif ... 
     else: 
      out_lines.append(line) 

    # Uncomment to write to different file name for edits testing 
    # with open(file_name + '.out', 'w') as f_out: 
    #  f_out.write('\n'.join(out_lines)) 

    # Write out the file, clobbering the original 
    with open(file_name, 'w') as f_out: 
     f_out.write('\n'.join(out_lines)) 

Downside con questo approccio è che ogni file deve essere abbastanza piccolo da stare in memoria due volte (lines + out_lines).

Buona fortuna!

Problemi correlati