使用Python列表中的值创建.csv文件


180

我正在尝试使用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语句。我怎样才能做到这一点?


谢谢大家,我结合了一些答案的思想来解决我的问题:)现在,我使用csv模块将[...]数据直接写入文件,导入csv data = [...] myfile = open(...) ...,'wb')out = csv.writer(open(“ myfile.csv”,“ w”),delimiter =',',quoting = csv.QUOTE_ALL)out.writerow(data)效果很好,我构造我的数据[]通过使用xlrd从电子表格中获取一些数据,然后csv模块将其写到具有正确定界符的文件中:)再次成功
Fortilan 2010年

最近的方法可能是使用熊猫
理查德(Richard)

Python 3.4用户,这对我来说最有效:stackoverflow.com/questions/25022677/…–
Leigh

Answers:


250
import csv

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

编辑:这仅适用于python2.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
请注意,csv2.x中的模块无法正确处理unicode。请参阅模块文档,以获取有关如何处理此问题的示例。docs.python.org/library/csv.html
Ignacio Vazquez-Abrams,2010年

14
您还可以使用wr.writerows(list)
tovmeod 2011年

writerow和writerows有什么区别?
tumultous_rooster14年

4
如果每个元素也是一个列表,则Writerows似乎会将列表中的每个元素分成几列。这对于输出表非常方便。
whatnick

5
那不适用于python 3.4。我越来越TypeError: 'str' does not support the buffer interface
botchniaque

105

这是Alex Martelli的安全版本:

import csv

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

3
加1使用with,确保完成后关闭文件
BoltzmannBrain 2015年

如果我在for循环中使用此功能,是否应该将整个with块嵌套在for循环下?还是只wr.writerow(my_list)在循环内效率更高?
crypdick

1
@crypdick,您绝对不应该将整个块放入循环中。打开文件,然后将每个行写成一个循环。无需打开文件n次即可写入n行。
格雷格·卡莱卡

如果要将字符串对象写入文件,建议在打开文件时使用'wt'以避免TypeError:需要类似字节的对象,而不是'str'。
don_Gunner94

39

对于另一种方法,可以在pandas中使用DataFrame:它可以轻松地将数据转储到csv中,就像下面的代码一样:

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

1
感谢您提供此代码段,它可能会立即提供帮助。通过说明为什么这是一个解决问题的好方法,适当的解释将大大提高其教育价值,并且对将来有相似但不相同的问题的读者来说更有用。请编辑您的答案以添加说明,并指出适用的限制和假设。
Toby Speight

5
同样,要使此列表有效,列表需要具有相同的长度,否则您将收到ValueError(pandas v 0.22.0)
cheevahagadog

32

我发现最好的选择是使用savetxt来自numpy模块的

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)

8
这对于数字工作很有用,但是在列表中包含字符串时将不起作用。
里卡多·克鲁兹

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"

4
为我产生一个空文件
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
Lorenz

7

在这种情况下,您可以使用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模块可以照顾这一切为您,让您在各种报价选项中进行选择(所有领域,只能用引号和分隔符,唯一的非数字字段等字段),以及如何esacpe控制charecters(双引号,或转义的字符串)。如果您的值很简单,则string.join可能会没问题,但是如果您必须管理很多边缘情况,请使用可用的模块。


3

这个解决方案听起来很疯狂,但是像蜂蜜一样平稳

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])
Lorenz

听起来真的很疯狂吗?我认为这听起来非常不错
Stephanie Owen

3

创建并写入csv文件

下面的示例演示如何创建和写入一个csv文件。要创建动态文件编写器,我们需要导入一个包import csv,然后需要使用open(“ D:\ sample.csv”,“ w”,newline =“”创建文件引用为Ex:-的文件实例。)作为file_writer

如果该文件不存在上述文件目录,则python将在指定目录中创建同一文件,“ w”代表写入,如果要读取文件,则将“ w”替换为“ r”或附加到现有文件,然后单击“ a”。newline =“”表示每次创建行时都会删除一个多余的空行,因此要消除空行,我们使用newline =“”,并使用诸如fields = [“ Names”,“ Age “,” Class“],然后 在此处使用Dictionary writer并分配列名,将其应用于writer实例,例如 writer = csv.DictWriter(file_writer,fieldnames = fields),以便将列名写入使用csv的csv中 ,而写入文件的值必须使用字典方法传递,这里的键是列名,而值是您各自的键值

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"})

2

Jupyter笔记本

假设您的清单是 A

然后,您可以编码以下广告,将其作为csv文件保存(仅列!)

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

1

您应该确定使用CSV模块,但是有可能需要编写unicode。对于那些需要编写unicode的人,这是示例页面中的类,您可以将其用作util模块:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

这是不需要csv模块的另一种解决方案。

print ', '.join(['"'+i+'"' for i in myList])

范例:

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

但是,如果初始列表包含一些“”,则不会对其进行转义。如果需要,可以调用一个函数来对其进行转义,如下所示:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.