Python 将带有特殊字符的Excel工作表输出到CSV

Python 将带有特殊字符的Excel工作表输出到CSV,python,excel,python-2.7,export-to-csv,xlrd,Python,Excel,Python 2.7,Export To Csv,Xlrd,我有一个包含多个工作表的Excel文件。我想从文件中提取一个特定的工作表,并将其保存为CSV文件,用逗号分隔。我还没有完成这项工作。工作表包含具有特殊字符的数据,类似于下面右侧的最后一列。我不介意忽略这些角色 **DateStamp Country ComputerName Domain IPAddress OperatingSystem** 2017-05-24 USA Computer1 Domain1 1.2.3.4 Win

我有一个包含多个工作表的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中包含u'。在尝试这样做时,我遇到了各种各样的错误。 我得到的错误是:

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'
这些错误发生在我能够写入日志之前


请给我一些帮助。谢谢

这应该能奏效。它将忽略无法转换的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)
我用一个excel文件测试了它,该文件包含一些虚假数据和文本Windows Server 20008®,它返回了以下csv_数据:

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的作用,我请你解释一下。基本上,这意味着首先用等效字符替换兼容字符。