Написать словарь в CSV-файл - PullRequest
0 голосов
/ 25 апреля 2019

Я хотел бы добавить значения из всех словарей, которые я создал в своем скрипте Python, в файл CSV во время выполнения моего кода, чтобы в конце у меня было что-то вроде этого:

Файл вначало:

id;Verbatim;score
15;je suis monter à la boulangerie;4
44;tu es méchant;5
45;je te hais et la foret enchanté est belle de milles faux et les jeunes filles sont assises au bor de la mer;7
47;je ne comprends pas la vie et je suis perdue, aide moi stp maman je suis perdue tu es ma seule amie et je t'aime;8

CSV-файл в конце: (для простого способа; я хотел бы добавить эти столбцы в существующий файл)

id;Verbatim;score;**d_tag;d_lemma;d_filtered_words**
15;Je suis monter à , la boulangerie;4;['Je\tPRO:PER\tje', 'suis\tVER:pres\tsuivre|être', 'monter\tVER:infi\tmonter', 'à\tPRP\tà', ',\tPUN\t,', 'la\tDET:ART\tle', 'boulangerie\tNOM\tboulangerie'];['je', 'suivre|être', 'monter', 'à', ',', 'le', 'boulangerie'];['monter', 'boulangerie']
44;Tu es ? méchant;5;['Tu\tPRO:PER\ttu', 'es\tVER:pres\têtre', '?\tSENT\t?', 'méchant\tNOM\tméchant'];['tu', 'être', '?', 'méchant'];['être', 'méchant']
45;Je te hais et la Foret enchantée est belle de milles faux et les jeunes filles sont assises au bor de la mer;7;['Je\tPRO:PER\tje', 'te\tPRO:PER\tte', 'hais\tVER:pres\thaïr', 'et\tKON\tet', 'la\tDET:ART\tle', 'Foret\tNAM\tForet', 'enchantée\tVER:pper\tenchanter', 'est\tVER:pres\têtre', 'belle\tADJ\tbeau', 'de\tPRP\tde', 'milles\tNOM\tmille', 'faux\tADJ\tfaux', 'et\tKON\tet', 'les\tDET:ART\tle', 'jeunes\tADJ\tjeune', 'filles\tNOM\tfille', 'sont\tVER:pres\têtre', 'assises\tVER:pper\tasseoir', 'au\tPRP:det\tau', 'bor\tNOM\tbor', 'de\tPRP\tde', 'la\tDET:ART\tle', 'mer\tNOM\tmer'];['je', 'te', 'haïr', 'et', 'le', 'Foret', 'enchanter', 'être', 'beau', 'de', 'mille', 'faux', 'et', 'le', 'jeune', 'fille', 'être', 'asseoir', 'au', 'bor', 'de', 'le', 'mer'];['haïr', 'Foret', 'enchanter', 'être', 'beau', 'mille', 'faux', 'jeune', 'fille', 'être', 'asseoir', 'bor', 'mer']
47;Je ne Comprends pas la vie et je ? suis perdue aide moi stp maman je suis perdue tu es ma seule amie et je t'aime;8;['Je\tPRO:PER\tje', 'ne\tADV\tne', 'Comprends\tVER:pres\tcomprendre', 'pas\tADV\tpas', 'la\tDET:ART\tle', 'vie\tNOM\tvie', 'et\tKON\tet', 'je\tPRO:PER\tje', '?\tSENT\t?', 'suis\tVER:pres\tsuivre|être', 'perdue\tVER:pper\tperdre', 'aide\tNOM\taide', 'moi\tPRO:PER\tmoi', 'stp\tVER:simp\tstp', 'maman\tNOM\tmaman', 'je\tPRO:PER\tje', 'suis\tVER:pres\tsuivre|être', 'perdue\tVER:pper\tperdre', 'tu\tPRO:PER\ttu', 'es\tVER:pres\têtre', 'ma\tDET:POS\tmon', 'seule\tADJ\tseul', 'amie\tNOM\tami', 'et\tKON\tet', 'je\tPRO:PER\tje', ""t'\tPRO:PER\tte"", 'aime\tVER:pres\taimer'];['je', 'ne', 'comprendre', 'pas', 'le', 'vie', 'et', 'je', '?', 'suivre|être', 'perdre', 'aide', 'moi', 'stp', 'maman', 'je', 'suivre|être', 'perdre', 'tu', 'être', 'mon', 'seul', 'ami', 'et', 'je', 'te', 'aimer'];['comprendre', 'vie', 'perdre', 'aide', 'stp', 'maman', 'perdre', 'être', 'seul', 'ami', 'aimer']

Полный код:

# -*- coding: UTF-8 -*-
import codecs 
import re
import os
import sys, argparse
import subprocess
import pprint
import csv
from itertools import islice
import pickle
import nltk
from nltk import tokenize
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords

try:
    import treetaggerwrapper
    from treetaggerwrapper import TreeTagger, make_tags
    print("import TreeTagger OK")
except:
    print("Import TreeTagger pas Ok")

from itertools import islice
from collections import defaultdict

#export le lexique de sentiments
pickle_in = open("dict_pickle", "rb")
dico_lexique = pickle.load(pickle_in)

# extraction colonne verbatim
d = {}

with open(sys.argv[1], 'r', encoding='utf-8') as csv_file:
    csv_file.readline()
    for line in csv_file:
        token = line.split(';')
        try:
            d[token[0]] = token[1]
        except:
            print(line)
print(d)

tagger = treetaggerwrapper.TreeTagger(TAGLANG='fr')
d_tag = {}
for key, val in d.items(): 
        newvalues = tagger.tag_text(val)
        d_tag[key] = newvalues
#print(d_tag)

#lemma dictionary
d_lemma = defaultdict(list)

for k, v in d_tag.items():
    for p in v:
        parts = p.split('\t')
        try:
            d_lemma[k].append(parts[2])
        except:
            print(parts)
print(d_lemma)                          

#filtered words
stopWords = set(stopwords.words('french'))
d_filtered_words = defaultdict(list)

d_filtered_words = {k: [w for w in l if w not in stopWords and w.isalpha()] for k, l in d_lemma.items()}
print(d_filtered_words)

#writing tags in the dictionary 
with open("sortie.csv", "w") as output:
    writer = csv.DictWriter(output, "w")
    for k, v in d_tag.items():
        writer.writerow(k)
        writer.writerow(v)

1 Ответ

0 голосов
/ 29 апреля 2019

Возможно, вам будет проще использовать только csv.reader() и csv.writer() для чтения и записи ваших файлов. Сначала прочитайте файл в rows, который будет списком строк. Этот подход означает, что нет необходимости отслеживать id как ключ в большом словаре. Вместо этого строки обрабатываются по одной строке за раз.

Затем возьмите второй элемент из каждой строки (verbatim) и вычислите ваши теги, леммы и отфильтрованные слова. Если вы хотите, чтобы они были записаны в стиле списка, преобразуйте каждый список в строку, используя str(). Затем эти три списка можно добавить в конец существующего row (используя extend()), а затем записать его в выходной файл:

import csv

# Read the CSV file into a list of lists
with open(sys.argv[1], 'r', encoding='utf-8', newline='') as f_input:
    csv_input = csv.reader(f_input, delimiter=';')
    header = next(csv_input)
    rows = list(csv_input)

# Create the output CSV file
with open('sortie.csv', 'w', encoding='utf-8', newline='') as f_output:
    csv_output = csv.writer(f_output, delimiter=';')
    header.extend(['d_tag', 'd_lemma', 'd_filtered_words'])
    csv_output.writerow(header)

    # Process the data, one row at a time
    for row in rows:
        if row:  # skip empty rows
            verbatim = row[1]

            # Calculate d_tag, d_lemma, d_filtered_words
            tags = ['a\tb\tc', 'd\te\tf']
            lemmas = ['1\t2\t3', '4\t5\t6']
            filtered_words = ['u\tv\tw\t', 'x\ty\tz']

            row.extend([str(tags), str(lemmas), str(filtered_words)])
            csv_output.writerow(row)
...