web-dev-qa-db-fra.com

Analyser un fichier texte CSV / délimité par des tabulations avec Python

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 importantes pour moi et les données des autres colonnes ne sont pas pertinentes.

En commençant à la ligne 8 et en travaillant ensuite par multiples de 7 (c'est-à-dire les 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 étant la valeur respective de la clé. J'ai essayé de le mettre en évidence ci-dessous mais le formatage n'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

Comme ci-dessus, je cherche à extraire la valeur de A7 (DDEFEEF) comme clé dans mon dictionnaire et "FEFEFEFE" étant les données respectives, puis ajouter une autre entrée à mon dictionnaire, en sautant à la ligne 15 avec "2938495" étant mon clé et "Smith" étant la valeur respective.

Aucune suggestion? Le fichier source est un fichier .txt avec des entrées délimitées par des tabulations. Merci

Clarification:

Juste pour clarifier, jusqu'à présent, j'ai essayé ce qui suit: -

import csv

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

Ce qui précède imprime simplement tout le contenu sur une ligne à la fois. J'ai essayé "pour la ligne (7) dans le lecteur" mais cela a renvoyé une erreur. Je l'ai ensuite recherché et j'ai essayé les éléments ci-dessous, mais cela n'a pas fonctionné non plus:

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
21
thefragileomen

Commencez par transformer le texte en une liste de listes. Cela prendra en charge la partie d'analyse:

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

Le reste peut être fait avec des 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
 ...
52
Raymond Hettinger

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

Pandas est une bibliothèque pour gérer les 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, chacun contenant une seule ligne du fichier. Les clés seront les noms des colonnes et les valeurs seront celles de chaque cellule.

Dans ton 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")
7
José Fonseca

Si le fichier est volumineux, vous pouvez ne pas vouloir le charger entièrement en mémoire à la fois. Cette approche évite cela. (Bien sûr, en faire un dict pourrait prendre de la RAM, mais il est garanti qu'il est 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ù j'ai obtenu extend d'avant. Je voulais dire update

3
kojiro