首页 文章

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

提问于
浏览
119

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

10 回答

  • 19

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

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

    这是Alex Martelli的安全版本:

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

    Jupyter笔记本

    让我们说你的清单是 A

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

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

    你应该确定使用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
    import csv
    
    with open(..., 'wb') as myfile:
        wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
        wr.writerow(mylist)
    

    编辑:这只适用于python 2.x.

    要使它与python 3.x一起使用,请将 w 替换为 wsee this SO answer

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

    这是另一个不需要 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])
    
  • 1

    使用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"
    
  • 1

    在这种情况下,您可以使用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

    这个解决方案听起来很疯狂,但是像蜜一样顺畅

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

    该文件由csvwriter编写,因此保持csv属性,即以逗号分隔 . 分隔符通过每次将列表项移动到下一行来帮助主要部分 .

  • 1

    我发现的最佳选择是使用numpy module中的 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)
    

相关问题