2017-05-26 133 views
0

我有一个包含多个工作表的Excel文件。我想从文件中取出一个特定的工作表,并将其保存为一个CSV文件,并用逗号分隔(至今我还没有这样做)。该工作表包含特殊字符与右下方最后一列相似的数据。我不介意忽略这些角色。将带有特殊字符的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' 

这些错误发生。

请给我一些帮助。谢谢!

回答

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) 

我是有一些假的数据的Excel文件和文本的Windows Server 20008 ®测试,它返回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 
+0

谢谢,但只有最后一行被写入到文件?即使我在写入文件之前打印coldata,它只有一行数据。也没有划界,我在哪里指定? –

+1

我更新了代码。你应该知道,如果你的excel文件真的很大,上面的例子可能是内存密集型的。在这种情况下,您可能需要直接写入文件。 –

+0

完美工作 - 谢谢!感兴趣的问题,请您介绍一下标准化函数与“NFKD”相关的内容吗? –