2017-05-26 6 views
0

複数のワークシートを持つExcelファイルがあります。特定のワークシートをファイルから取り出し、カンマで区切られたCSVファイルとして保存したいと思います(私はまだこれまでには得られていません)。ワークシートには、右下の最後の列に似た特殊文字のデータが含まれています。私はこれらの文字を無視しても構いません。これまでCSVに特殊文字を含むExcelワークシート

**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行だけです。また、それは区切られていませんが、どこで指定しますか? –

+1

私はコードを更新しました。上記の例は、あなたのExcelファイルが本当に大きい場合、メモリを大量に消費する可能性があることに注意してください。その場合、ファイルに直接書き込むことができます。 –

+0

完璧に動作します - ありがとう!興味のあることは、「NFKD」を参照して正規化機能が何をしているのか説明できますか? –

関連する問題