首页 > 解决方案 > 如何将字典写入已存在且已包含标题的 csv 文件?

问题描述

我对python还是有点陌生​​,所以请原谅我的无知。我有一个 CSV 文件,它已经包含了第一行中的标题:column_1column_2column_3. 我有一个字典,将列名映射到它们各自的整数,我想把这个字典写在 CSV 文件中,整数出现在下一行。但是,1不断在 的末尾附加column_3,如column_31和 ,2并且3出现在 旁边的两个单元格中column_3

bigdict = {'column_1':1,'column_2':2,'column_3':3}

f = path

with open(f,'a+') as csv_file:
    fieldnames = ['column_1','column_2','column_3']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames,delimiter=',')
    csv_file.readline()
    writer.writerow(bigdict)

我以前写过文本文件,我读过 CSV 文件,我还“打开”了不存在的 CSV 文件并向它们写了字典,但是出于某种原因,将字典写到现有的 CSV 文件中胜过我。

上面,我没有创建标题,因为它们已经存在。我这样写csv_file.readline()是为了让脚本可以读取第二行,而不是稍后将字典写入第一行。当我最终调用时.writerow,出于某种原因,它正在编写附加到第一行末尾的字典值,如上所述......

我在这里做错了什么?

我按照下面 Rakesh 的方法,我得到了以下错误:

Traceback (most recent call last):

  File "<ipython-input-30-a0a3cb0b4ddd>", line 1, in <module>
    runfile('/Users/[name]/Documents/webscraper/tests/dictwritetoexistingcsv.py', wdir='/Users/[name]/Documents/webscraper/tests')

  File "/Users/[name]/anaconda/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 866, in runfile
execfile(filename, namespace)

  File "/Users/[name]/anaconda/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

  File "/Users/[name]/Documents/webscraper/tests/dictwritetoexistingcsv.py", line 13, in <module>
writer.writerow(bigdict)

  File "/Users/[name]/anaconda/lib/python3.6/csv.py", line 155, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))

TypeError: a bytes-like object is required, not 'str'

标签: pythoncsvdictionary

解决方案


希望我正确理解了您的问题,我认为问题在于您的 csv 文件在最后一行的末尾没有换行符。所以,我会在继续添加新行之前先检查一下。

我从这个简单的 csv 文件开始,bigcsv.csv它与脚本位于同一目录中。最初的内容是:

column_1,column_2,column_3
a, b, c

这是代码:

import os
import csv

dir_path = os.getcwd()
file_path = os.path.join(dir_path, "bigcsv.csv")


bigdict = {'column_1': 1, 'column_2': 2, 'column_3': 3}

with open(file_path, 'a+') as csv_file:
    fieldnames = ['column_1', 'column_2', 'column_3']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=',')
    if '\n' not in csv_file.readlines()[-1]:
        csv_file.write("\n")
    writer.writerow(bigdict)

这是我运行脚本后的文件。

column_1,column_2,column_3
a, b, c
1,2,3

希望能帮助到你。


推荐阅读