1

我的问题有很多排列,但最接近的答案是:

如何将 Python 字典写入 csv 文件?

不幸的是,每行打印输出如下:

matthew, green
rachel, blue
raymond, red

其中 somedict = dict(raymond = "red", rachel = "blue", matthew = "green")

我的问题需要更多这样的输出:

why, date, story
"because", "sunday", "blah blah blah"

我从用户输入中获取字典,重要的是输出文件将每个新答案(为什么、日期和故事)放在一个新行上(此外,列标题只打印一次)。所以我的代码如下所示:

import csv
o = "file.csv"
why = input("Why? ")
date = input("Date: ")
story = input("Story: ") 

总之,我需要如下所示的输出:

why, date, story
"because", "sunday", "blah blah blah"
"i don't know", "monday", "blah blah blue"
"third base", "monday", "blah blah blarg"

我只是在寻找一种简单的方法来获取用户输入,将其写入 csv 文件中的新行。我已经在这里待了大约两个小时,所以这就是我在这里的原因。首先我遇到了两个 TypeError 错误:(1)'str' 不支持缓冲区接口(我通过在 with open(file, "wb", "utf-8") 语句中添加 "utf-8" 参数来解决这个问题)。(2) TypeError:需要整数。出于某种原因,我从“wb”中取出了“b”,它似乎摆脱了这个错误。我发布的链接让我几乎可以到达我需要的地方,但还不够,我真诚地感谢任何人可以提供的任何快速澄清。

编辑

为了清楚起见,我尝试了几种可能性。最有希望的是:

with open("file.csv", "w", encoding = "utf-8") as f:
    w = csv.writer(f)
    w.writerows(somedict.items())

它产生了我上面引用的第一个输出,这不是我需要的。

我也试过:

with open("file.csv", "w", encoding = "utf-8") as f:
    w = csv.writer(f)
    w.writerow(somedict.keys())
    w.writerow(somedict.values())

但这给了我:_csv.Error: sequence expected

4

3 回答 3

5

如果您只想获取用户输入并将其写入 csv 文件中的新行,则无需字典即可。在字典中执行此操作实际上取决于字典的设置方式 - 如果您对此进行更多解释可能会有所帮助?如果这是我想象的方式,kalgasnik 的答案是一个很好的答案。

但是如果没有必要使用字典(我对您的问题的一般印象),这种方式非常简单:

import csv
with open('file.csv', 'w') as f:
    w = csv.writer(f, quoting=csv.QUOTE_ALL) 

    while (1):
        why = input("why? ")
        date = input("date: ")
        story = input("story: ")
        w.writerow([why, date, story])

它直接从用户输入产生您想要的输出。

编辑

这种方式设计用于您只是一遍又一遍地接收数据的情况,因此是 while (1)(永远循环)。如果您想一次接收一组,请完全删除 while 循环 - 这与在末尾添加一个 break 具有相同的效果。

如果您想在每次写入之间打开和关闭文件(例如,如果您将在其间做很多其他工作),那么在打开文件时使用 'a' 而不是 'w' 来追加,这将写入每个新行上的新字符串集。

这可能是一个示例,说明在最后将所有集合全部写入文件之前将所有集合存储在某个地方可能是个好主意,因为始终打​​开和关闭文件可能会很昂贵(我不知道这是否是您的考虑因素)。如果您仍然对字典感到不满意,您可以简单地将每个 [why, date, story] ​​列表添加到一个更大的列表中,然后在最后编写时循环遍历列表。

于 2012-09-29T00:58:35.777 回答
1

“不幸的是,每行都像这样打印输出”-如果我理解正确,这是您的解决方案

i1 = {"why": "because", "date": "sunday", "story": "blah blah blah"}
i2 = {"why": "i don't know", "date": "monday", "story": "blah blah blue"}
i3 = {"why": "third base", "date": "monday", "story": "blah blah blarg"}

keys = ("why", "date", "story")
with open('mycsvfile.csv','wb') as f:
    w = csv.DictWriter(f, keys)
    w.writeheader()
    for answer in (i1,i2,i3):
        w.writerow(answer)
于 2012-09-29T00:45:27.693 回答
0

csv.writerquoting参数控制写入时是否引用字段。如果您将此参数的值设置为csv.QUOTE_ALL,那么您的所有字段都将被引用。

于 2012-09-29T00:30:08.757 回答