2015-05-04 16 views
5

Sto tentando di utilizzarlo per manipolare i dati in file txt di grandi dimensioni.Estrazione di colonne contenenti un determinato nome

Ho un file txt con più di 2000 colonne e circa un terzo di questi ha un titolo che contiene la parola "Net". Voglio estrarre solo queste colonne e scriverle in un nuovo file txt. Qualche suggerimento su come posso farlo?

Ho cercato in giro un po 'ma non sono stato in grado di trovare qualcosa che mi aiuti. Mi scuso se domande simili sono state poste e risolte prima.

MODIFICA 1: Grazie a tutti! Al momento della stesura di 3 utenti hanno suggerito soluzioni e tutti funzionano molto bene. Onestamente non pensavo che la gente avrebbe risposto così non ho controllato per un giorno o due, e sono stato felicemente sorpreso da questo. Sono molto colpito

EDIT 2: Ho una foto che mostra ciò che una parte del txt-file originale può assomigliare, nel caso in cui vi aiuterà chiunque in futuro:

Sample from original txt-file

+0

Si può allegare un piccolo campione del file con la domanda di rendere il problema dichiarazione un po 'più chiara? – ZdaR

+0

Sicuro! Ho già ricevuto assistenza, ma ora ho incluso una piccola immagine di un campione del codice nel caso in cui possa aiutare chiunque in futuro – Rickyboy

risposta

6

Un modo per farlo, senza l'installazione di moduli di terze parti come numpy/panda, è il seguente. Dato un file di input, chiamato "input.csv" come questo:

a, b, c_net, d, e_net

0,0,1,0,1

0,0,1, 0,1

(rimuovere le righe vuote in mezzo, sono solo per la formattazione del contenuto in questo post)

il seguente codice fa quello che vuoi.

import csv 


input_filename = 'input.csv' 
output_filename = 'output.csv' 

# Instantiate a CSV reader, check if you have the appropriate delimiter 
reader = csv.reader(open(input_filename), delimiter=',') 

# Get the first row (assuming this row contains the header) 
input_header = reader.next() 

# Filter out the columns that you want to keep by storing the column 
# index 
columns_to_keep = [] 
for i, name in enumerate(input_header): 
    if 'net' in name: 
     columns_to_keep.append(i) 

# Create a CSV writer to store the columns you want to keep 
writer = csv.writer(open(output_filename, 'w'), delimiter=',') 

# Construct the header of the output file 
output_header = [] 
for column_index in columns_to_keep: 
    output_header.append(input_header[column_index]) 

# Write the header to the output file 
writer.writerow(output_header) 

# Iterate of the remainder of the input file, construct a row 
# with columns you want to keep and write this row to the output file 
for row in reader: 
    new_row = [] 
    for column_index in columns_to_keep: 
     new_row.append(row[column_index]) 
    writer.writerow(new_row) 

Si noti che non vi è alcuna gestione degli errori. Ce ne sono almeno due che dovrebbero essere gestiti. Il primo è il controllo dell'esistenza del file di input (suggerimento: controlla la funzionalità fornita dai moduli os e os.path). Il secondo consiste nel gestire righe o righe vuote con una quantità incoerente di colonne.

+0

Wow grazie mille, funziona come un fascino! Molto colpito :) – Rickyboy

4

Questo potrebbe essere fatto per esempio con i panda,

import pandas as pd 

df = pd.read_csv('path_to_file.txt', sep='\s+') 
print(df.columns) # check that the columns are parsed correctly 
selected_columns = [col for col in df.columns if "net" in col] 
df_filtered = df[selected_columns] 
df_filtered.to_csv('new_file.txt') 

Naturalmente, dal momento che non abbiamo la struttura del file di testo, si dovrà adattare le argomentazioni di read_csv per fare questo lavoro nel tuo caso (vedi il corrispondente documentation).

Questo caricherà tutto il file in memoria e quindi filtrerà le colonne non necessarie. Se il tuo file è così grande da non poter essere caricato in RAM in una sola volta, c'è un modo per caricare solo colonne specifiche con l'argomento usecols.

+0

Neat! Funziona perfettamente – Rickyboy

3

È possibile utilizzare la funzione di filtro panda per selezionare alcune colonne basate su espressioni regolari

data_filtered = data.filter(regex='net') 
+0

Bello!Questa semplice linea funziona molto bene per estrarre le colonne una volta che il file è stato letto. Grazie! – Rickyboy