【问题标题】:Write dictionary in csv file在 csv 文件中写入字典
【发布时间】:2019-09-14 08:31:27
【问题描述】:

我想在我的代码执行期间将我在 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)

【问题讨论】:

  • 如果您edit 问题来展示一个工作示例,这将有所帮助。即显示一些示例输入 CSV 行以及预期的输出 CSV 文件应如下所示。
  • @MartinEvans 我重新编辑了我的帖子。

标签: python csv dictionary stop-words reader


【解决方案1】:

您可能会发现仅使用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)

【讨论】:

  • 谢谢你的回答,但我能得到一个错误:逐字=行[1]索引错误:列表索引超出范围
  • 这意味着您的 CSV 文件中有空行(可能是最后一行)。可以添加一个简单的if row: 测试。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2014-06-30
  • 2017-03-28
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多