【问题标题】:Create excel-compatible CSV file with python?用 python 创建与 excel 兼容的 CSV 文件?
【发布时间】:2011-12-28 19:18:18
【问题描述】:

我正在尝试使用真正与 Excel 兼容的 python 创建一个 csv 文件(我使用的是 Excel 2007,如果这有什么不同的话)。

这是我正在尝试做的事情

import csv

data = [ ['9-1', '9-2', '9-3'] ]

fd = open('test.csv', 'wb')
try:
    writer = csv.writer(fd, dialect='excel', quotechar='"', quoting=csv.QUOTE_ALL)
    writer.writerows(data)

finally:
    fd.close()

这将创建一个包含以下内容的 csv 文件:

"9-1","9-2","9-3"

当我在 Excel 中加载它时,我得到了列:

09-Jan  09-Feb  09-Mar

[Grrr,谢谢 Excel。说真的,引号的意义何在?]

现在,我有 read elsewhere,为了让 Excel 将字符串视为文字,它们必须以等号 ="Like This" 为前缀。所以我真正想要制作的是:

="9-1",="9-2",="9-3"

有没有办法用 python 中的csv 模块做到这一点?我猜这将涉及创建一个custom dialect,但我看不到任何可以给我想要的结果的变量。

【问题讨论】:

    标签: python excel csv


    【解决方案1】:

    FWIW,Excel 2007 甚至与自身不兼容。如果您在一个空的电子表格中键入 9-1,它会在您离开单元格后立即将其转换为 1-Sep。如果您将单元格格式从“常规”更改为“文本”,则可以不加更改地输入字符串文字并将其保存为 .csv 文件,但当您将同一文件读入空白电子表格(使用常规格式)时,它会重新转换为日期。

    Excel 将文件另存为

    9-1,9-2,9-3
    

    没有引号和“=”符号。即使在读取 csv 文件之前将单元格格式设置为 Text 对我也不起作用 - 它导入为日期(显示值 1-Sep,单元格值 9/1/2011),其中 3 个单元格采用自定义格式;其余单元格转换为 General。

    编辑:一个 csv 文件包含:

    "9-1",'9-2',='9-3',=''9-4''
    

    读入电子表格:

    1-Sep  '9-2'  ='9-3'  ="9-4"
    

    所以= 没有任何好处,但至少单引号会得到一个字符串文字,并保留引号。 Excel 中知识渊博的人将不得不帮助摆脱引号; “粘贴值”不会剥离它们。

    【讨论】:

    • 是的,Excel 很烂。我什至不会使用它,除非我工作场所的某些人坚持使用它来查看数据。
    【解决方案2】:

    如果您的目标只是在 Excel 上将列表写成表格。您可以尝试以下示例,其中“;”和 dialect='excel-tab' 属性使我们能够在列之间切换。

    import csv
    
    RESULTS = [
        ['val_col1;','val_col2;','val_col3']
    ]
    resultFile = open("testExcel.csv",'wb')
    resultWriter= csv.writer(resultFile, dialect='excel-tab')
    resultWriter.writerows(RESULTS)
    

    【讨论】:

      【解决方案3】:

      问题是您正在使用 Excel 的 CSV 导入器将 CSV 文件导入 Excel。我知道这违反直觉,但您不应该以这种方式导入 CSV 文件。相反,将它们作为文本文件导入(即,带有 txt 扩展名的名称)。然后,您将有机会指定每列的类型,并可以为在 Excel 中看起来像日期的列正确选择文本。

      如果您正在寻找“这是一个可以在 Excel 中打开的文件”的统包方法,请尝试 xlwt(不是我最初的建议 pyXLWriter)并完全避免使用 CSV。

      【讨论】:

      • 谢谢。我将文件扩展名更改为 .txt,这迫使 Excel 调出文本导入器向导。但是,我必须单独选择每一列并选择作为文本导入(无法选择多个列)。有 100 多列,这对我来说并不是一个真正可用的解决方案:-(
      • 可以选择多个列并在第 3 步中使用 Shift-Click 一次性更改所有列。
      • 哦,是的。它现在正在工作......我想我一定尝试过 Ctrl 而不是 Shift。谢谢
      • 您也可以考虑使用 xlwt 作为另一种直接从 python 编写 excel 文件的方法,可以在 python-excel.org 获得它在几个项目中对我来说效果很好。
      • -1 用于 pyXLWriter。这与挪威蓝鹦鹉一样。尽管 sourceforge 本周显示了 12 次下载。是你造成的吗??它没有维护(最后一次更新:6 年前),写入 Excel 5/7 XLS 文件,并且有问题。
      【解决方案4】:

      好的,谢谢大家的帮助,我想出了一个粗略的解决方案,所以我想在这里分享一下。

      这不是最漂亮的解决方案,但它适用于我的目的。但是有一个警告:如果您的字符串中有任何引号,它将中断!

      import csv
      import re
      
      data = [ ['9-1', '9-2', '9-3'] ]
      
      
      def quoteCsvData(data):
          for x, row in enumerate(data):
              for y, item in enumerate(row):
                   if data[x][y] != '':
                       data[x][y] = r'="' + data[x][y] + r'"'
          return data
      
      def unquoteCsvData(data):
          for x, row in enumerate(data):
              for y, item in enumerate(row):
                  if data[x][y] != '':
                      m = re.match(r'="([^"]*)"',data[x][y])
                      if m:
                          data[x][y] =  m.group(1)
          return data
      
      
      fd = open('test2.csv', 'wb')
      data = quoteCsvData(data)
      try:
          writer = csv.writer(fd, delimiter=',',
                                  quotechar='|', 
                                  quoting=csv.QUOTE_NONE, 
                                  escapechar='\\')
          writer.writerows(data)
      
      finally:
          fd.close()
      
      fd = open('test2.csv', 'rb')
      try:
          reader = csv.reader(fd, delimiter=',', 
                                  quotechar='|', 
                                  quoting=csv.QUOTE_NONE, 
                                  escapechar='\\')
          data = []
          for row in reader:
              data.append(row)
      
      finally:
          fd.close()
      
      data = unquoteCsvData(data)
      
      print data
      

      更新:删除了包含大量 ="" 的空单元格的垃圾邮件

      【讨论】:

        【解决方案5】:
        data = [ ['9-1', '9-2', '9-3'] ]
        fd = open('test.csv', 'wb')
        for row in data:
            for x in row:
                fd.write('="{}",'.format(x))
            fd.write('\n')
        

        【讨论】:

        • 问题不是让 Python 写入文件,而是让 Excel 读取 .csv 文件而不破坏数据。
        【解决方案6】:

        尝试::

        dialect=csv.excel
        

        import csv
        csv.excel 
        
        • 行终止符'\r\n'
        • 跳过初始空间错误
        • 引用 0
        • 分隔符','
        • quotechar '"'
        • 双引号正确

        对我来说,它有点像黑魔法,从来没有让我烦恼到去阅读代码,但我所做的小实验总是让 excel (2003) 在上述格式中表现得足够好。

        【讨论】:

        • 这与dialect='excel' 完全相同,即不是 OP 想要的。
        猜你喜欢
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多