2015-10-12 5 views
0

J'ai un tas de fichiers texte séparés par des tabulations que j'ai besoin de traiter. Je dois obtenir les en-têtes pour toutes les valeurs uniques dans la colonne 'étude'.Python: Récupère les en-têtes de colonne pour les données de certaines colonnes

Par exemple: Si mes données sont comme:

csv1:

name study id race 
aaa cb10 123 asian 
bbb cb10 128 
ccc vj97 864 

CSV2:

name study vaccine 
aaa cb10 
bbb cb10 abc 
ccc vj97 poi 

à partir de plusieurs fichiers, ma sortie doit être les en-têtes de colonnes pour tous les études dans la colonne «étude»:

cb10- name,study,id,race,vaccine 
vj97- name,study,id,vaccine 

J'ai le code ci-dessous:

import os 
import sys 
import glob, ntpath, csv 

def get_header_for_tsv_file(tsv_data): 
    if not os.path.exists("Results"): 
     os.makedirs("Results") 

    #output_path = os.path.join ("Results",study + ".csv") 

    result = [] 
    search_for = study 
    header = tsv_data.next() 
    #output_file = open (output_path, "ab") 
    #for row in tsv_data: 
    if data["study"] in search_for: 
     print data 

def path_leaf(path): 
    head, tail = ntpath.split(path) 
    return tail or ntpath.basename(head) 

def get_tsv_list(): 
    tsv_list = glob.glob(os.getcwd()+"\*.txt") 
    return tsv_list 

def get_tsv_data(tsv_name): 
    file_name = os.path.join(tsv_name + ".txt") 
    if not os.path.exists(file_name): 
     print "Error: Couldn't find file:", file_name 
     sys.exit(-1) 

    input_data = open (file_name) 
    input_data = csv.DictReader(input_data, delimiter = "\t") 
    return input_data 

def run(tsv_name): 
    tsv_data = get_tsv_data(tsv_name) 
    header_data = get_header_for_tsv_file(tsv_data) 

if __name__ == "__main__": 
    tsv_list = get_tsv_list() 
    filename = [path_leaf(path) for path in tsv_list] 
    for index in range(0, len(filename)): 
     tsv_name_list = filename[index] 
     tsv_name = os.path.splitext(os.path.basename(tsv_name_list))[0] 
     tsv_data = get_tsv_data(tsv_name) 
     for data in tsv_data: 
      study = data["study"] 
      run(tsv_name) 

Je cherche à le faire en utilisant package csv par défaut au lieu de pandas géants, si possible. Y a-t-il un moyen de le faire?

+0

Jetez un oeil un pandas géants - un outil très puissant pour faire un tel traitement –

Répondre

0

En pseudocode:

load all file via pandas 
take the unique values from the studys - series 
make a set from the values above. 
Output them 
+0

Merci de votre réponse. Je cherche à le faire en utilisant le paquet csv par défaut au lieu de pandas, si possible. Y a-t-il un moyen de le faire? – pam

+0

Oui, je pense: Itérer juste sur chaque ligne (selon https://docs.python.org/2/library/csv.html), ajouter le contenu de la deuxième "cellule" à une liste et convertir cette liste à un ensemble à la fin. Attention: ceci suppose que l'étude est toujours sur la position n ° 2 - sinon, un travail est nécessaire pour obtenir la position à partir de la rangée d'en-tête –