Python 如何将字典写入已存在且已包含标题的csv文件?

Python 如何将字典写入已存在且已包含标题的csv文件?,python,csv,dictionary,Python,Csv,Dictionary,我对python还是有点陌生,所以请原谅我的无知。我有一个CSV文件,它已经在第一行中包含了标题:column\u 1、column\u 2和column\u 3。我有一个字典,可以将列的名称映射到它们各自的整数,我想在CSV文件中编写这个字典,整数显示在下一行。但是,1一直被追加到列3的末尾,如列31中,2和3出现在列3旁边的两个单元格中 bigdict = {'column_1':1,'column_2':2,'column_3':3} f = path with open(f,'a+'

我对python还是有点陌生,所以请原谅我的无知。我有一个CSV文件,它已经在第一行中包含了标题:
column\u 1
column\u 2
column\u 3
。我有一个字典,可以将列的名称映射到它们各自的整数,我想在CSV文件中编写这个字典,整数显示在下一行。但是,
1
一直被追加到
列3
的末尾,如
列31
中,
2
3
出现在
列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\u 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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('/Users/[name]/Documents/webscraper/tests/dictwritetoexistingcsv.py',wdir='/Users/[name]/Documents/webscraper/tests')
文件“/Users/[name]/anaconda/lib/python3.6/site packages/spyder/utils/site/sitecustomize.py”,第866行,在runfile中
execfile(文件名、命名空间)
文件“/Users/[name]/anaconda/lib/python3.6/site packages/spyder/utils/site/sitecustomize.py”,第102行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“/Users/[name]/Documents/webscraper/tests/dictwritetoexistingcsv.py”,第13行,在
writer.writerow(bigdict)
文件“/Users/[name]/anaconda/lib/python3.6/csv.py”,第155行,writerow格式
返回self.writer.writerow(self.\u dict\u to\u list(rowdict))
TypeError:需要类似字节的对象,而不是“str”

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

我从这个名为
bigcsv.csv
的简单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

希望能有所帮助。

如果3.x文件模式为“a+”,那么您使用的python版本应该适合您。我正在运行python 3.6.0。我运行了与您完全相同的代码,我得到了
索引器:列表索引超出范围
。因此,我重写了代码并分配了
a=csv\u file.readlines()
a=csv\u file.readline()
,以查看其内容。当我打印
a
时,它什么也不打印(
'
)。我确实正确地保存了CSV文件,即
.CSV
。。。我没什么可试的了。好吧,我知道什么有效了。我用“r+”替换了“a+”,它可以工作。但是我不完全确定为什么。r+从文件的开头读取,而不是像a+那样从结尾读取。但是,此脚本的连续运行会在下一行中正确输出bigdict,而不是重新替换第一行。我不太明白a+和r+是如何工作的。打开文件有不同的模式。我在上面的回答中使用了Python3.4。然而,在Python3.6中有一点不同。因此,在3.6版本中,基本上从最后一个字符开始写入文件。因此
csv_file.readlines()[-1]
会因
索引器而失败。脚本的连续运行会正确地输出到
bigdict.csv
,因为
writer.writerow(bigdict)
会自动在行的末尾追加换行符。