簡體   English   中英

如何解決將字典寫入csv的以下問題?

[英]How to fix the following issue writing a dictionary into a csv?

您好,我正在與sklearn一起使用,並且使用kmeans進行自然語言處理,我使用Kmeans從注釋創建聚類,然后創建了一個字典,其中聚類的數目為Key,而注釋列表則為與值相關的列表,如下所示:

dict_clusters = {}
for i in range(0,len(kmeans.labels_)):
    #print(kmeans.labels_[i])
    #print(listComments[i])
    if not kmeans.labels_[i] in dict_clusters:
        dict_clusters[kmeans.labels_[i]] = []
    dict_clusters[kmeans.labels_[i]].append(listComments[i])
print("dictionary constructed")

我想用我嘗試過的這本字典寫一個csv:

Out = open("dictionary.csv", "wb")
w = csv.DictWriter(Out,dict_clusters.keys())
w.writerows(dict_clusters)
Out.close()

但是,由於出現以下錯誤,因此我不確定為什么出錯,此外,由於kmeans.labels_包含多個值,因此我不確定此錯誤是否與numpy有關,

Traceback (most recent call last):
  File "C:/Users/CleanFile.py", line 133, in <module>
    w.writerows(dict_clusters)
  File "C:\Program Files\Anaconda3\lib\csv.py", line 156, in writerows
    return self.writer.writerows(map(self._dict_to_list, rowdicts))
  File "C:\Program Files\Anaconda3\lib\csv.py", line 146, in _dict_to_list
    wrong_fields = [k for k in rowdict if k not in self.fieldnames]
TypeError: 'numpy.int32' object is not iterable

我想感謝對此的支持,我希望通過以下字典獲得一個csv:

key1, value
key2, value
.
.
.
keyN, value

從這里獲得反饋后,我嘗試:

with open("dictionary.csv", mode="wb") as out_file:
    writer = csv.DictWriter(out_file, headers=dict_clusters.keys())
    writer.writerow(dict_clusters)

我有:

Traceback (most recent call last):
  File "C:/Users/CleanFile.py", line 129, in <module>
    writer = csv.DictWriter(out_file, headers=dict_clusters.keys())
TypeError: __init__() missing 1 required positional argument: 'fieldnames'

嘗試2:

Out = open("dictionary.csv", "wb")
w = csv.DictWriter(Out,dict_clusters.keys())
w.writerows([dict_clusters])
Out.close()

輸出:

Traceback (most recent call last):
  File "C:/Users/CleanFile.py", line 130, in <module>
    w.writerows([dict_clusters])
  File "C:\Program Files\Anaconda3\lib\csv.py", line 156, in writerows
    return self.writer.writerows(map(self._dict_to_list, rowdicts))
TypeError: a bytes-like object is required, not 'str'

try3,此嘗試需要花費大量時間來計算輸出:

Out = open("dictionary.csv", "wb")
w = csv.DictWriter(Out,dict_clusters.keys())
w.writerow(dict_clusters)
Out.close()

我正在使用的python版本如下:

3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
3.5.2

經過很多次嘗試后,我決定使用一種更好的方法來構建字典,如下所示:

from collections import defaultdict
pairs = zip(y_pred, listComments)

dict_clusters2 = defaultdict(list)

for num, comment in pairs:
    dict_clusters2[num].append(comment)

但是,似乎某些字符使csv文件的創建失敗,如下所示:

with open('dict.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    for key, value in dict_clusters2.items():
       writer.writerow([key, value])

輸出:

Traceback (most recent call last):
  File "C:/Users/CleanFile.py", line 146, in <module>
    writer.writerow([key, value])
  File "C:\Program Files\Anaconda3\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f609' in position 6056: character maps to <undefined>

為了更清楚,我執行了:

for k,v in dict_clusters2.items():
    print(k, v)

我得到了類似的東西:

1 ['hello this is','the car is red',....'performing test']
2 ['we already have','another comment',...'strings strings']
.
.
19 ['we have',' comment music',...'strings strings dance']

我的字典有一個鍵和幾個注釋的列表,我想要一個csv,如下所示:

1,'hello this is','the car is red',....'performing test'
2,'we already have','another comment',...'strings strings'
.
.
19,'we have',' comment music',...'strings strings dance'

但是,似乎某些字符的映射不正確,並且一切都失敗了,感謝您的支持,我希望得到支持。

writerows方法必須包含字典列表:

Out = open("dictionary.csv", "wb")
w = csv.DictWriter(Out,dict_clusters.keys())
w.writerows([dict_clusters])
Out.close()

您可能正在尋找需要單個字典對象的writerow

Out = open("dictionary.csv", "wb")
w = csv.DictWriter(Out,dict_clusters.keys())
w.writerow(dict_clusters)
Out.close()

另外:您可能還想考慮使用open作為上下文管理器(在with塊中),以確保文件已正確關閉:

with open("dictionary.csv", mode="wb") as out_file:
    writer = csv.DictWriter(out_file, headers=dict_clusters.keys())
    writer.writerow(dict_clusters)

在Py3 Ipython會話中,您的特殊字符呈現為:

In [31]:  '\U0001f609'
Out[31]: '😉'

給我們一個字典的小樣本,或者更好的是您用來構建它的值。

我沒有太多使用csv ,甚至更少使用csv.DictWriter numpy用戶經常使用np.savetxt編寫csv文件。 在編寫純數字數組時,這很容易使用。 如果要混合使用字符和數字列,則比較麻煩,需要使用結構化數組。

另一種選擇是直接直接編寫文本文件。 只需打開它,然后使用f.write(...)將格式化的行寫入文件。 實際上, np.savetxt實際上np.savetxt了:

with open(filename, 'w') as f:
    for row in myArray:
       f.write(fmt % tuple(row))

savetxt構造一個fmt字符串,如%s, %d, %f\\n 它也適用於需要wb模式的字節串。 因此,您的特殊角色可能會遇到更多問題。

集中精力打印字典,一次只用一個鍵可能會有所幫助,例如

for k in mydict.keys():
   print(`%s, %s`%(k, mydict[k]))

作為一個開始。 一旦獲得正確的print格式,就很容易將其轉換為文件寫入。

===============

我可以用您的代碼編寫一個假設的字典:

In [58]: adict={1:'\U0001f609'}
In [59]: with open('test.txt','w') as f:
    ...:     writer=csv.writer(f)
    ...:     for k,v in adict.items():
    ...:         writer.writerow([k,v])
    ...:         
In [60]: cat test.txt
1,😉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM