Python,为什么csv writer在值周围加上引号?

3

我想将一个列表保存到CSV文件中。问题在于,当我想重新加载该文件时,值都变成了字符串。

当我执行我的代码并然后运行“cat”命令查看“file_name”文件时,输出结果为:

cat test.csv -> "[1, 2]","[3, 4]","[5, 3]"

我的代码是:

import csv

def save_workschedule():
    small_list = [[1, 2], [3, 4], [5, 3]]
    c = csv.writer(open("test.csv", "w"))
    c.writerow(small_list)

save_workschedule()

如何在不带引号的情况下保存列表?

1
“row”是您传递的列表,其中包含这三个子列表。由于这三个子列表是行中的项目,因此它们被转换为字符串进行书写,因此需要用引号括起来。 - FlipTack
没有捷径。您正在将文本写入文本文件。如果您希望在读取时文件看起来像"[[1, 2], [3, 4], [5, 3]]",则在writerow时将small_list包装在另一个列表中,即c.writerow([small_list]) - Patrick Haugh
那你尝试过配置引号了吗?你实际想要什么输出?每个子列表都应该是一行吗?其他逗号应该如何解释? - jonrsharpe
我想在csv文件中有值[1, 2],[3, 4],[5, 3]。 - Vinz
@Vinz,你绝对需要引号,也称为文本限定符。如果没有它们,当你将数据读入其他地方时,你会在错误的逗号上进行拆分。不知道更多情况下...我怀疑你可能正在使任务比必要的更加困难...你总体上想做什么? - Sevyns
你需要使用writerows而不是writerow。这样每个子列表就会成为一个CSV行。 - tdelaney
1个回答

5

我觉得这有点像一个XY问题

引号的原因是你的值包含逗号(其中一个值是"[1, 2]"),因此CSV写入器必须将它们放在引号中以区分那些逗号和记录分隔符。

解决这个问题的一种方法是选择不同的分隔符,例如分号。

但更有意义的做法可能是将该列表保存在JSON文件或pickle中。所以你需要回答的问题是:为什么使用CSV?


可以使用任何文件,但是CSV模块很容易使用。我现在开始使用pickle了。 - Vinz
@Vinz 另一个很好的替代pickle的选择是json。它不仅更易读,而且是一种相对广泛认可的标准文件格式。pickles基本上只限于Python脚本。 - Aaron
3
@Vinz:CSV非常适合存储表格/文本数据。Python对象(例如列表)应该以一种可以识别这些可能嵌套结构的格式进行存储。我更喜欢JSON,因为它易读性强——生成的文件可以被人类理解。它们也具有可移植性。Pickle文件是二进制的,只能在Python中使用。 - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接