将包含特殊字符的 Excel 工作表输出到 CSV
Output Excel worksheet with special characters to 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'
这些错误发生在我能够写入日志之前。
请问我能得到一些帮助吗?谢谢!
这应该可以解决问题。它会忽略它无法转换的 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
我有一个包含多个工作表的 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'
这些错误发生在我能够写入日志之前。
请问我能得到一些帮助吗?谢谢!
这应该可以解决问题。它会忽略它无法转换的 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