3 votes

Écriture des clés d'un dictionnaire dans un fichier csv en fonction de la clé commune et de la valeur de la colonne

J'ai deux fichiers CSV que je dois joindre. L'un des fichiers contient une partie des informations que je veux. J'ai créé un dictionnaire des informations dont j'ai besoin à partir du CSV 1 et je dois écrire ce dictionnaire dans le CSV 2. Je voudrais écrire les clés du dictionnaire à leur ID approprié dans le CSV 2.

Comment puis-je écrire le dictionnaire dans le CSV2 ? Mon code remplit chaque entrée de la colonne "animal" avec la même valeur.

Des exemples du dictionnaire, du CSV2 et du CSV de sortie sont fournis pour permettre l'interprétation du code.

Code ci-dessous

Dictionary
{'511': 'Dog', '611': 'Cat'}

CSV
ID,   Location,   Country
511,  Stack,      USA
611,  Overflow    Mexico 
711,  Stack       USA

Expected CSV
ID,   Location,    Country,    Pet
511,  Stack,       USA,        Dog
611,  Overflow,    Mexico,     Cat
711,  Stack        USA,  

Output Generated CSV
ID,   Location,    Country,    Pet
511,  Stack,       USA,        Dog
611,  Overflow,    Mexico,     Dog
711,  Stack        USA,        Dog

def readfile(filename):
    global map 
    with open(filename, 'rb') as file:
        map = {}
        reader = csv.reader(file)               
        for row in reader:
            #print row[0]
            key = row[0]
            if key in map:
                pass
            map[key] = row[1:]
    file.close()
    return True

#print map.keys()

def writefile(filename):
    Location = 'Location'
    tmpfile = filename + '_tmp.csv'

    with open(filename, 'rb') as input:  
        with open(tmpfile,'w+b') as output:
            dreader = csv.DictReader(input, delimiter=',')
            fieldnames = dreader.fieldnames
            fieldnames.append(Location)

            print('I am here 1')   
            csvwriter = csv.DictWriter(output,fieldnames, delimiter = ',')

            #csvwriter.writeheader()
            try:
                csvwriter.writeheader()

            except AttributeError:
                    headers = []
                    for h in fieldnames:
                        headers.append((h,h))
                        csvwriter.writerow(dict(headers))
            print('I am here 2')

            try:
                for row in dreader:
                    for col in row:
                        if col is None: continue
                    s = row[col]
                    if s is not None:
                        row[col] = s.replace('"', '\'').replace('\\','\\\\').strip()
                        if row[col] == "NULL": 
                            row[col] = ''

                        for key,value in map.iteritems():
                            if len(value) == 1 and key == 'ID':
                               pass
                            else:
                                row[Location] = value[0]

       # w.writeheader()
                    csvwriter.writerow(row)

        #print('I am here')
            except Exception: 
                    print ('Could not write appropriate value')

1voto

Andrej Kesely Points 20452

Essayez :

import csv

dic = {"511": "Dog", "611": "Cat"}

with open("in.csv", "r") as f_in, open("out.csv", "w") as f_out:
    reader = csv.reader(f_in)
    writer = csv.writer(f_out)
    headers = next(reader)
    writer.writerow(headers + ["Pet"])

    for row in reader:
        writer.writerow(row + [dic.get(row[0], "")])

Cela crée out.csv avec du contenu :

ID,Location,Country,Pet
511,Stack,USA,Dog
611,Overflow,Mexico,Cat
711,Stack,USA,

0voto

Deepak Tripathi Points 362

Essayez ça :

import csv
d = {'511': 'Dog', '611': 'Cat'}

with open("temp.csv", "r") as input_file, open("temp1.csv", "w+") as output_file:
    input_csv = csv.DictReader(input_file, delimiter=",")
    output_csv = csv.DictWriter(output_file, fieldnames=input_csv.fieldnames + ["Pet"])
    output_csv.writeheader() and output_csv.writerows({**row, **{"Pet": d.get(row.get("ID"))}} for row in input_csv)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X