【问题标题】:Python: writing two different dictionaries out to two different csv filesPython:将两个不同的字典写入两个不同的 csv 文件
【发布时间】:2016-06-23 01:06:01
【问题描述】:

我的程序查看文本文件的文件夹并生成我正在查看“SS”和“DS”的两个功能的计数以及它们出现的次数。所以我建立了一个字典,列出了这个特征以及它在文本中出现的次数。

我希望我的 SS 字典写出到一个 csv 文件,而 DS 字典写出到另一个 csv 文件。

到目前为止,这是我的代码:

import glob
import re

path = "tagged texts\*.txt"

#establish counts and dictionaries
list_SS = []
list_DS = []
SScounts = {}
DScounts = {}

#generate counts of the features
for file in glob.glob(path):
    line_count = 0
    with open(file, encoding='utf-8', errors='ignore') as file_in:
        text = file_in.readlines()
        for line in text:
            word = line.split('_')
            if word[2] == "SS":
                list_SS.append(word[0])
            elif word[2] == "DS":
                list_DS.append(word[0])

#create dictionary for SS and write out results to file
file1_out = open("SS_counts.csv", "w+")
for w in list_SS:
    SScounts[w] = SScounts.get(w,0) + 1
for i in sorted(SScounts, key = SScounts.get, reverse=True):
    file1_out.write(str(i) + "," + str(SScounts[i]) + "\n")

#create dictionary for DS and write out results to file
file2_out = open ("DS_counts.csv", "w+")
for w in list_DS:
    DScounts[w] = DScounts.get(w,0) + 1
for i in sorted(DScounts, key = DScounts.get, reverse=True):
    file2_out.write(str(i) + "," + str(DScounts[i]) + "\n")

SS 字典出来就好了,这是 csv 文件中的结果:

nisha,41
rasha,19
rikusha,13
apisha,11
nishashi,8
...

问题是第二个文件,DS 文件变成空白,里面什么都没有。在对字典中的变量名进行一些摆弄之前,我会将 SS 字典的结果写到两个文件中。

在问过我的教授后,我创建了两本词典,他说可以从一本词典中完成,但使用两本会更简单。而且我想我可以为 DS 结果编写一个单独的 python 脚本,但我想在同一个脚本中做这两个。

Sooo,怎么了?为什么第二个字典没有写入第二个文件?

【问题讨论】:

  • PDB 在这种情况下是你的朋友。如果您不熟悉它,那么假设文件不是很大,我会将 list_SS.append(word[0]) 更改为 pass 并将 list_DS.append(word[0]) 更改为 print("Found DS")。如果没有任何显示,那么您知道您的问题在该行之上(我猜这些文件是不同的)。如果你打印了一些东西,那么下面的问题就是问题所在。或者,在第一个 for 语句之后 print(len(list_DS)) 查看错误在哪一半代码中。
  • 您应该养成在完成文件后关闭文件的习惯,例如file1_out.close()。更好的是,您应该养成使用with 语句来使用文件的习惯: with open("filename") as f: for line in f: # ... do stuff ...
  • 我们可以运行一些测试用例吗?
  • @ivan7707 我使用了 print 语句,发现我的 list_DS 中没有显示任何内容。然后我意识到到底发生了什么,我通过另一个脚本运行文本文件,该脚本为项目分配了 V-SS 或 V-DS 的标签,当我创建一个额外的标签字段时,我已将 V-SS 更改为“SS”。我忘记将 V-DS 更新为 DS。因此我的 DS 没有被填充。我更改了另一个程序并对 DS 进行了更新,现在它可以正常工作了。愚蠢的错误。

标签: python csv dictionary


【解决方案1】:

StackOverflow 的公民无法运行您的代码。创建一个其他人可以运行的Minimal, Complete, and Verifiable 示例通常会有所帮助。

一个关键问题:list_SSlist_DS 中是否有数据?删除所有以file1_out 开头的代码,改为使用以下代码:

assert list_SS
assert list_DS

如果这些断言失败,那么您已经大大缩小了问题范围。

另一个关键问题:如果消除通配符和文件读取,能否重现问题?大致是这样的:

list_SS = []
list_DS = []
SScounts = {}
DScounts = {}

text = [
    'an example line from your data files...',
    'ditto...',
    '...',
]

for line in text:
    word = line.split('_')
    if word[2] == "SS":
        list_SS.append(word[0])
    elif word[2] == "DS":
        list_DS.append(word[0])

assert list_SS
assert list_DS

此时,您将获得 StackOverflow 可以提供帮助的一些东西……但到那时您可能不需要我们。

【讨论】:

  • assert list_DS 失败,所以我想知道它是不是出了什么问题,结果里面什么都没有,因为在文本文件中它被标记为 V-DS 而不是 DS,我想我改变了它。所以真的这是一个愚蠢的错误,我按照我的代码中的规定将标记为 V-DS 的项目更改为 DS。无论如何它有效,字典被填充并且脚本正确地写到第二个文件中。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2022-01-08
  • 1970-01-01
  • 2021-12-16
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多