2011-10-21 12 views
14

J'ai actuellement un fichier CSV qui, lorsqu'il est ouvert dans Excel, a un total de 5 colonnes. Seules les colonnes A et C sont significatives pour moi et les données dans les autres colonnes ne sont pas pertinentes.Analyse du fichier txt CSV/délimité par tabulation avec Python

A partir de la ligne 8 et en travaillant ensuite par multiples de 7 (lignes 8, 15, 22, 29, 36 etc ...), je cherche à créer un dictionnaire avec Python 2.7 avec les informations de ces champs . Les données de la colonne A seront la clé (un entier à 6 chiffres) et les données de la colonne C seront les valeurs respectives de la clé. J'ai essayé de mettre en évidence ce ci-dessous, mais la mise en forme est pas le meilleur: -

A  B  C   D 
1       CDCDCDCD 
2       VDDBDDB 
3 
4 
5 
6 
7 DDEFEEF     FEFEFEFE 
8 123456   JONES 
9 
10 
11 
12 
13 
14 
15 293849   SMITH 

Selon ce qui précède, je suis à la recherche d'extraire la valeur de A7 (DDEFEEF) comme une clé dans mon dictionnaire et " FEFEFEFE "étant les données respectives et ensuite ajouter une autre entrée à mon dictionnaire, saut à la ligne 15 avec" 2938495 "étant ma clé et" Smith "étant la valeur respective.

Des suggestions? Le fichier source est un fichier .txt dont les entrées sont délimitées par des tabulations. Merci

Précision:

Juste pour clarifier les choses, à ce jour, j'ai essayé le ci-dessous: -

import csv 

mydict = {:} 
f = open("myfile", 'rt') 
reader = csv.reader(f) 
    for row in reader: 
     print row 

ci-dessus simplement imprime sur tout le contenu si une ligne à la fois. J'ai essayé "pour la rangée (7) dans le lecteur" mais ceci a retourné une erreur. Je me suis alors fait des recherches et avait un aller au-dessous, mais cela n'a pas fonctionné ni:

import csv 
from itertools import islice 

entries = csv.reader(open("myfile", 'rb')) 
mydict = {'key' : 'value'} 

for i in xrange(6): 
    mydict['i(0)] = 'I(2) # integers representing columns 
    range = islice(entries,6) 
    for entry in range: 
     mydict[entries(0) = entries(2)] # integers representing columns 
+0

@jdigital - question originale éditée pour contenir ce que j'ai essayé jusqu'à présent – thefragileomen

+0

« à partir de la ligne 8 » ne correspond pas à « A7 », « entier à 6 chiffres » n'est pas compatible avec "DDEFEEF" - s'il vous plaît modifier votre question. –

+0

@John Machin - A7 n'est pas la cellule dont je veux extraire les données, c'est A8. Les données dans A7 sont simplement juste pour vous donner un exemple de ce que d'autres données existent dans mon fichier CSV. Comme ce n'est pas un nombre entier à six chiffres, il doit être ignoré. Merci – thefragileomen

Répondre

43

Démarrer en tournant le texte dans une liste de listes. Cela prendra soin de la partie analyse syntaxique:

lol = list(csv.reader(open('text.txt', 'rb'), delimiter='\t')) 

Le reste peut se faire avec les recherches indexées:

d = dict() 
key = lol[6][0]  # cell A7 
value = lol[6][3] # cell D7 
d[key] = value  # add the entry to the dictionary 
... 
+2

A travaillé bien ensemble avec une boucle for. Merci – thefragileomen

2

Si le fichier est volumineux, vous voudrez peut-être de ne pas charger entièrement en mémoire à la fois . Cette approche évite cela. (Bien sûr, faire un dict hors de celui-ci pourrait encore prendre un peu de RAM, mais il est garanti d'être plus petit que le fichier d'origine.)

my_dict = {} 
for i, line in enumerate(file): 
    if (i - 8) % 7: 
     continue 
    k, v = line.split("\t")[:3:2] 
    my_dict[k] = v 

Edit: Je ne sais pas où je suis arrivé extend d'avant. Je voulais dire update

+0

merci pour la réponse. J'ai essayé d'implémenter ce qui précède et d'obtenir un "ValueError" sur la dernière ligne - "l'élément de séquence de mise à jour de dictionnaire # 0 a la longueur 1; 2 est requis". Aucune suggestion? – thefragileomen

+0

@thefragileomen édité pour une approche plus lisible qui ne nécessite pas trois niveaux d'accolades pour travailler;) – kojiro

3

Bien qu'il n'y ait rien de mal avec les autres solutions présentées, vous pouvez simplifier et considérablement améliorer vos solutions en utilisant les excellents pandas de bibliothèque de python.

Pandas est une bibliothèque de gestion de données en Python, préférée par de nombreux Data Scientists. Pandas possède une interface CSV simplifiée pour lire et analyser des fichiers, qui peut être utilisée pour renvoyer une liste de dictionnaires contenant chacun une seule ligne du fichier. Les clés seront les noms des colonnes, et les valeurs seront celles de chaque cellule.

Dans votre cas:

import pandas 

    def create_dictionary(filename): 
     my_data = pandas.DataFrame.from_csv(filename, sep='\t', index_col=False) 
     # Here you can delete the dataframe collumns you dont want! 
     del my_data['B'] 
     del my_data['D'] 
     # ... 
     # Now you transform the DataFrame to a list of dictionaries 
     list_of_dicts = [item for item in my_data.T.to_dict().values()] 
     return list_of_dicts 

# Usage: 
x = create_dictionary("myfile.csv") 
Questions connexes