2017-05-26 59 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」相關的內容嗎? –