【问题标题】:Create a .csv file with values from a Python list使用 Python 列表中的值创建一个 .csv 文件
【发布时间】:2011-01-06 05:52:40
【问题描述】:

我正在尝试使用 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 模块将 [...] 数据直接写入文件 import csv data = [ ...] myfile = open(..., 'wb') out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL) out.writerow (data) 效果很好,我通过使用 xlrd 从电子表格中抓取一些数据来构造我的 data[],然后 csv 模块将其写入具有正确分隔符的文件中:) 再次
  • 最近的方法可能是使用pandas
  • Python 3.4 用户,这对我来说效果最好:stackoverflow.com/questions/25022677/…

标签: python csv xlrd


【解决方案1】:

Jupyter 笔记本

假设您的列表名称是A

然后您可以编写以下代码,并将其作为 csv 文件(仅限列!)

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

【讨论】:

    【解决方案2】:

    对于那些寻找不太复杂的解决方案的人。实际上,我发现这是一种更简单的解决方案,可以完成类似的工作:

    import pandas as pd
    a = ['a','b','c'] 
    df = pd.DataFrame({'a': a})
    df= df.set_index('a').T
    df.to_csv('list_a.csv', index=False)
    

    希望这也有帮助。

    【讨论】:

      【解决方案3】:

      这是 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,然后需要创建一个带有文件引用的文件实例 例如:- 使用 open("D:\sample.csv","w",newline="") 作为 file_writer

        这里如果文件不存在与提到的文件目录,那么python将在指定的目录中创建一个相同的文件,“w”代表写,如果你想读取一个文件,那么将“w”替换为“r”或附加到现有文件然后“a”。 newline="" 指定每次创建行时都会删除一个额外的空行,因此为了消除空行,我们使用 newline="",使用 fields=["Names" 之类的列表创建一些字段名(列名) ,"Age","Class"],然后适用于 writer 实例,例如 writer=csv.DictWriter(file_writer,fieldnames=fields) 这里使用 Dictionary writer 并分配列名,将列名写入 csv 我们使用 writer.writeheader() 并写入值我们使用 writer.writerow({"Names":"John" ,"Age":20,"Class":"12A"}),写入文件值时必须使用字典方式传递,这里key是列名,value是你各自的key值

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

        【讨论】:

          【解决方案5】:
          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 (see this SO answer)

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

          【讨论】:

          • 请注意 2.x 中的 csv 模块不能正确处理 unicode;有关如何处理此问题的示例,请参阅模块文档。 docs.python.org/library/csv.html
          • 你也可以使用 wr.writerows(list)
          • Writerows 似乎将列表中的每个元素分解为列,如果每个元素也是一个列表。这对于输出表格非常方便。
          • 这不适用于 python 3.4。我收到TypeError: 'str' does not support the buffer interface
          • 对于 Python 2,请使用 'w',如下所示:stackoverflow.com/questions/34283178/…
          【解决方案6】:

          这个解决方案听上去很疯狂,但效果非常好

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

          该文件正在由 csvwriter 写入,因此 csv 属性得到维护,即逗号分隔。 分隔符每次都将列表项移动到下一行,从而在主要部分起到帮助作用。

          【讨论】:

          • 这么小这么快
          • 有效,如果你有一个嵌套列表,扩展@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])
          • 听起来真的很疯狂吗?我觉得听起来很不错
          【解决方案7】:

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

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

          【讨论】:

          • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 它的教育价值,通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
          • 此外,要使其正常工作,列表需要具有相同的长度,否则您将收到 ValueError (pandas v 0.22.0)
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 这对数字工作很有用,但在列表中包含字符串时就不行了。
            • 这在包含字符串和数字(​​浮点数和整数)的列表中对我有用。
            【解决方案10】:

            您肯定应该使用 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)
            

            【讨论】:

              【解决方案11】:

              这是 Alex Martelli 的安全版本:

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

              【讨论】:

              • 加 1 用于使用with,确保文件在完成后关闭
              • 如果我在 for 循环中使用它,是否应该将整个 with 块嵌套在 for 循环下?或者在循环中只包含wr.writerow(my_list) 会更有效吗?
              • @crypdick 您绝对不应该将整个块放入循环中。打开文件,然后循环写入每一行。无需打开文件n次即可写入n行。
              • 如果您将字符串对象写入文件,建议在打开文件时使用 'wt' 以避免 TypeError: a bytes-like object is required, not 'str'。
              【解决方案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"
              

              【讨论】:

              • 为我生成一个空文件
              • 第一次运行是空的,你也不能删除它,因为它是在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
              【解决方案13】:

              在这种情况下,您可以使用 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 可能会没问题,但如果您必须管理大量边缘情况,请使用可用的模块。

              【讨论】:

                猜你喜欢
                • 2016-07-18
                • 2023-03-16
                • 1970-01-01
                • 2011-05-06
                • 1970-01-01
                • 2015-05-02
                • 2020-06-18
                • 1970-01-01
                相关资源
                最近更新 更多