2010-01-18 96 views
97

我试图用Python列表中的值创建一个.csv文件。当我在列表打印值它们是所有Unicode(?),即,它们看起来像这样使用Python列表中的值创建一个.csv文件

[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声明。我怎样才能做到这一点?

+0

谢谢大家,我已经从几个答案结合的思路去解决我的问题:)我现在用的csv模块写的[...]数据直接进入文件 导入CSV data = [...] myfile = open(...,'wb') out = csv.writer(open(“myfile.csv”,“w”),delimiter =',',quoting = csv.QUOTE_ALL) out.writerow(data) 工作的很好,我通过从差价中获取一些数据来构建我的数据[] heet使用xlrd和csv模块用正确的分隔符将它写出到一个文件中 所有好:)再次ty所有 – Fortilan 2010-01-21 04:34:29

+0

更近的方法可能是使用[pandas](http://pandas.pydata.org/pandas -python/stable-io.html#io-store-in-csv) – Richard 2016-04-13 06:13:25

+0

Python 3.4用户,这对我最合适:http://stackoverflow.com/questions/25022677/python-3-4-writinga-a- list-to-csv?newreg = 95656f0c688e4ee6ac073dbca96177c1 – Leigh 2016-04-26 21:53:35

回答

145
import csv 

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

请注意'csv 2.x中的模块不能正确处理unicode;有关如何处理此问题的示例,请参阅模块文档。 http://docs.python.org/library/csv.html – 2010-01-18 07:39:52

+9

您还可以使用wr.writerows(列表) – tovmeod 2011-12-25 22:29:34

+0

Writer和Writer之间有什么区别? – 2014-06-09 05:52:57

6

在这种情况下,您可以使用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 module可以为您处理所有这些问题,允许您在各种引用选项(所有字段,仅包含引号和分隔符的字段,仅包含非数字字段等)之间进行选择,以及如何防止控制字符串引号或转义字符串)。如果你的值很简单,string.join可能是好的,但如果你不得不管理大量的边缘情况,请使用可用的模块。

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" 
+0

为我生成一个空文件 – caspii 2017-10-08 13:38:38

70

这里是亚历克斯·马尔泰利的安全版本:

import csv 

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

加1使用'with',确保文件在完成时关闭 – BoltzmannBrain 2015-05-15 20:20:36

+0

如果我在for循环中使用它,应该将整个block放在for循环中吗?或者在循环内部只有'wr.writerow(my_list)'会更有效率吗? – crypdick 2017-06-07 23:05:44

+1

@crypdick你绝对不应该把整个块放到循环中。打开文件,然后在循环中写入每一行。没有必要为了写n行而打开文件n次。 – 2017-11-14 00:17:55

1

你应该使用肯定是CSV模块,但有可能,你需要编写unicode。对于那些需要写unicode的,这是从示例页面类,你可以作为一个实用程序模块使用:

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) 
10

我发现用的是savetxtnumpy module最好的选择:

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) 
+1

这对数字作品很有用,但在列表中使用字符串时不起作用。 – 2015-12-19 02:42:29

1

这里是不需要csv MODU另一种解决方案乐。

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

对于另一种方法,你可以在pandas使用DataFrame: 它可以很容易地转储数据为CSV就像下面的代码:

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

感谢您使用此代码段,这可能会提供一些即时帮助。通过展示*为什么*这是一个很好的解决方案,对未来的读者会有更好的解决方案,这将为它的教育价值提供一个合适的解释[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 – 2017-07-05 09:10:46

0
import csv 

with open("file.csv", 'w') as myfile: 
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) 
    wr.writerow(mylist) 
+0

同上https://stackoverflow.com/a/21872153/4982729上面的答案。 – markroxor 2018-01-17 06:19:38

+0

虽然这段代码可能会回答这个问题,但提供关于**如何**和**为什么**的其他上下文可以解决问题,这可以提高答案的长期价值。 – Alexander 2018-03-02 17:43:15

+0

@markroxor我不这么认为,其他答案写二进制forme'WB'这个答案是只写wthout二进制,这是不一样的 – hisi 2018-03-04 13:19:15

相关问题