使用Python列表创建一个包含值的.csv文件

253

我尝试从Python列表中创建一个带有值的csv文件。当我打印列表中的值时,它们都是Unicode(?),即它们看起来像这样

[u'value 1', u'value 2', ...]

如果我遍历列表中的值,例如:for v in mylist: print v,它们看起来是纯文本。

我可以在它们之间加上,,使用print ','.join(mylist)

我也可以将它们输出到文件中,例如:

myfile = open(...)
print >>myfile, ','.join(mylist)

但我想将输出写入CSV文件,并在列表中的值周围添加分隔符,例如:

"value 1", "value 2", ... 

我找不到一种简单的方法来包含分隔符在格式化字符串中,例如,我已经尝试通过join语句来实现,如何做到这一点?

我无法找到在格式化字符串中包含分隔符的简单方法,例如,我已经尝试了使用join语句,但是没有成功。请问有什么其它方法吗?


谢谢大家,我结合了几个答案的想法来解决我的问题 :) 现在我使用csv模块将[...]数据直接写入文件import csvdata = [...]myfile = open(..., 'wb') out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL) out.writerow(data) 很好用,我通过使用xlrd从电子表格中获取一些数据来构建我的data[],然后csv模块将其以正确的分隔符写入文件一切都很好 :) 再次感谢大家 - Fortilan
1
一种更为新的方法可能是使用pandas - Richard
Python 3.4用户,这对我来说效果最好:http://stackoverflow.com/questions/25022677/python-3-4-writing-a-list-to-a-csv?newreg=95656f0c688e4ee6ac073dbca96177c1 - Leigh
1
另请参见:如何使用Python读写CSV文件? - Martin Thoma
13个回答

316
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

编辑:这仅适用于Python 2.x。

要使其与Python 3.x一起使用,请将wb替换为w参见此SO答案

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
请注意,Python 2.x 中的 csv 模块无法正确处理 Unicode;请参考模块文档中的示例来处理这个问题。http://docs.python.org/library/csv.html - Ignacio Vazquez-Abrams
20
你也可以使用wr.writerows(list) - tovmeod
5
如果每个元素也是一个列表,Writerows会将列表中的每个元素分成列。这对于输出表格非常方便。 - whatnick
6
这在 Python 3.4 中不起作用。我得到了“TypeError:'str'不支持缓冲区接口”的错误。 - botchniaque
1
对于Python 2,请使用'w',如此处所示:https://dev59.com/GFsX5IYBdhLWcg3wDr88 - banan3'14
显示剩余4条评论

125

以下是Alex Martelli的安全版本:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

5
使用 with 增加 1 分,确保在完成后关闭文件。 - BoltzmannBrain
如果我在for循环中使用它,整个with块是否应嵌套在for循环下面?或者只有wr.writerow(my_list)在循环内会更有效率? - crypdick
1
@crypdick,你绝对不应该将整个块放入循环中。打开文件,然后在循环中写入每一行。没有必要打开文件n次来写入n行。 - Greg Kaleka
1
如果您要将字符串对象写入文件,建议在打开文件时使用“wt”以避免出现TypeError:需要类似字节的对象,而不是“str”。 - don_Gunner94
为避免使用 with,可以改用以下代码:f = open("myfile.csv","w")out = csv.writer(f, delimiter=',',quoting=csv.QUOTE_ALL)out.writerow([11,22,338])f.close() - Pe Dro

70

另一种方法是使用 pandas 中的 DataFrame

您可以像以下代码一样轻松将数据转储为 CSV:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

3
谢谢你提供这段代码片段,它可能会立即帮到一些人。一个适当的解释将极大地提高它的教育价值,因为它能够展示这是为什么一个好的解决方案,并且会使得它对未来有类似但不完全相同问题的读者更有用。请编辑你的回答,添加解释,并指出应用的限制和假设。 - Toby Speight
6
要让这个工作起来,列表需要具有相同的长度,否则您将收到一个 ValueError 错误(pandas v 0.22.0)。 - cheevahagadog

40

我发现最好的选择是使用numpy模块中的savetxt函数:

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

如果您有多个需要堆叠的列表

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

9
这对数字工作很好,但在列表中涉及字符串时无法使用。 - Ricardo Magalhães Cruz
3
这对我在一个既包含字符串又包含数字(浮点数和整数)的列表中起作用。 - mikey
@mikey,浮点数和整数都是数字。 - Abhimanyu Pallavi Sudhir

12

使用Python的csv模块来读写逗号或制表符分隔的文件。因为它能够很好地控制引用,所以建议使用csv模块。

例如,以下是一个实例:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

生成:

"value 1","value 2","value 3"

5
为我生成一个空文件。 - caspii
第一次运行为空,不能删除,因为它是在Python中打开的。第二次运行(或者更准确地说:out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))填充数据,无论您是否放置了open("myfile.csv","w")或新文件open("myfile2.csv","w")。似乎out对象无法处理按顺序构建的文件对象,而是将输出过程存储为待办事项。换句话说:out对象在第一次运行时存储文件对象,但只有当文件对象已经存在时才进行写入!请参见下面@Saurabh Adhikary的正确解决方案。 - questionto42

10

Jupyter notebook

假设你的列表名为A

然后你可以编写以下代码,将其保存为csv文件(仅包含列!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

9
这个解决方案听起来很疯狂,但是效果非常好。
import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

文件由csvwriter编写,因此保留了csv属性,即逗号分隔。 分隔符有助于通过将列表项移动到下一行来进行主要部分的处理,每次移动一个列表项。

1
如此小巧,如此迅速。 - Ian Samz
1
如果您有一个嵌套列表,可以扩展@vy32的示例,代码如下:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data]) - questionto42
1
这真的听起来很疯狂吗?我觉得听起来完全没问题。 - Stephanie Owen
io.UnsupportedOperation: read - Peyman

8
你可以在这种情况下使用string.join方法。
为了清晰起见,将其拆分为几行 - 这是一个交互式会话。
>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

或者作为一行代码
>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

然而,如果您的字符串中包含引号,则可能会出现问题。如果是这种情况,您需要决定如何转义它们。 CSV模块可以为您处理所有这些内容,允许您在各种引用选项(所有字段、仅带引号和分隔符的字段、仅非数字字段等)之间进行选择,并决定如何转义控制字符(双引号或转义字符串)。如果您的值很简单,string.join可能会很好用,但如果您需要管理大量边缘情况,请使用可用的模块。

8

这是一个可工作的复制粘贴示例,适用于Python 3.x版本,并提供选项以定义自己的分隔符和引号字符。

import csv

mylist = ['value 1', 'value 2', 'value 3']

with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
    employee_writer.writerow(mylist)

这将生成一个名为employee_file.csv的文件,其中包含如下所示的内容:
"value 1","value 2","value 3"

注意:

如果引用设置为csv.QUOTE_MINIMAL,则.writerow()仅在字段包含分隔符或引号字符时才会引用。这是默认情况。

如果引用设置为csv.QUOTE_ALL,则.writerow()将引用所有字段。

如果引用设置为csv.QUOTE_NONNUMERIC,则.writerow()将引用所有包含文本数据的字段,并将所有数字字段转换为浮点数据类型。

如果引用设置为csv.QUOTE_NONE,则.writerow()将转义分隔符而不是引用它们。在这种情况下,您还必须为escapechar可选参数提供一个值。


4

创建并写入csv文件

以下示例演示如何创建并写入csv文件。 为了创建一个动态的文件写入器,我们需要导入一个包 import csv,然后需要使用文件引用创建一个文件实例。 例如:with open("D:\sample.csv","w",newline="") as file_writer

如果指定的文件目录中不存在该文件,则Python将在指定的目录中创建相同的文件。"w"表示写入,如果您要读取文件,则用"r"替换"w",如果要追加到现有文件,则用"a"。newline=""指定它会为每次创建行删除一个额外的空行,因此我们使用newline=""来消除空行,使用列表创建一些字段名(列名)如fields=["Names","Age","Class"],然后将其应用于writer实例,如 writer=csv.DictWriter(file_writer,fieldnames=fields) 这里使用字典编写器并分配列名,要写入csv文件的列名我们使用writer.writeheader(),要写入值我们使用writer.writerow({"Names":"John","Age":20,"Class":"12A"}),在写入文件时必须使用字典方法传递值,这里键是列名,值是相应的键值。

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

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