【问题标题】:Output Excel worksheet with special characters to CSV将带有特殊字符的 Excel 工作表输出到 CSV
【发布时间】:2017-05-26 13:58:26
【问题描述】:

我有一个包含多个工作表的 Excel 文件。我想从文件中取出一个特定的工作表并将其保存为 CSV 文件,用逗号分隔(我还没有做到这一点)。该工作表包含具有类似于右下方最后一列的特殊字符的数据。我不介意忽略这些字符。

    **DateStamp Country ComputerName    Domain    IPAddress   OperatingSystem**
    2017-05-24  USA     Computer1       Domain1   1.2.3.4     Windows 2008
    2017-05-24  England Computer2       Domain2   1.2.3.5     Windows Server® 2008

到目前为止我的代码是:

import os
import xlrd
import sys

file = 'path/to/my/file.xlsx'
workbook = xlrd.open_workbook(file)
sheet = workbook.sheet_by_name('Data')

for rowx in range(sheet.nrows):
    coldata = sheet.row_values(rowx)
    coldata = " ".join(str(x) for x in coldata).encode('ascii')
with open ('/path/log.txt','a') as results:
    results.write(coldata)
results.close()

我必须将数据转换为字符串,否则它将在每个字段旁边包含 u',这是我不希望在我的 CSV 中出现的。在尝试这样做时,我遇到了各种错误。 我得到的错误是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 14: ordinal not in range(128)

如果我试图忽略这些字符,我会得到这个:

colsdata = colsdata.decode('ascii','ignore')
Attribute error: 'list' object has no attribute 'decode'

这些错误发生在我能够写入日志之前。

请给我一些帮助。谢谢!

【问题讨论】:

    标签: python excel python-2.7 export-to-csv xlrd


    【解决方案1】:

    这应该可以解决问题。它将忽略无法转换的 unicode 字符。

    import os
    import xlrd
    import sys
    import unicodedata
    
    workbook_path = "path/to/my/file.xlsx"
    workbook = xlrd.open_workbook(workbook_path)
    sheet = workbook.sheet_by_name("Sheet1")
    csv_data = ""
    
    def normalize(value):
         result = unicodedata.normalize("NFKD", unicode(value)).encode("ascii","ignore")
         return result
    
    for rowx in range(sheet.nrows):
        coldata = sheet.row_values(rowx)
        # Append data to string that we are going to output
        # and add new line
        csv_data += ", ".join(normalize(x) for x in coldata) + "\n"
    
    with open ("/path/log.txt","a") as results:
        results.write(csv_data)
    

    我使用包含一些虚假数据和文本 Windows Server 20008 ® 的 excel 文件对其进行了测试,它为 csv_data 返回了以下内容:

    print csv_data
    
    foo, bar, baz
    1.0, 2.0, 3.0
    4.0, 5.0, 6.0
    7.0, 8.0, Windows Server 2008
    

    【讨论】:

    • 谢谢,但只有最后一行被写入文件?即使我在写入文件之前打印coldata,它也只有一行数据。而且它没有分隔,我在哪里指定?
    • 我已经更新了代码。您应该知道,如果您的 excel 文件非常大,上面的示例可能会占用大量内存。在这种情况下,您可能希望直接写入文件。
    • 完美运行 - 谢谢!感兴趣的问题,请您解释一下规范化功能参考“NFKD”的作用吗?
    • 我将您推荐给Python Unicode Graceful Degradation to ASCII 以获得解释。基本上,这意味着首先将兼容的字符替换为对应的字符。
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多