Недостатки чтения строк из Excel в python с использованием encode ('utf-8') - PullRequest
2 голосов
/ 13 октября 2011

Я читаю большой объем данных из электронной таблицы Excel, в которую я читаю (и переформатирую и переписываю) из электронной таблицы, используя следующую общую структуру:

book = open_workbook('file.xls')
sheettwo = book.sheet_by_index(1)
out = open('output.file', 'w')
for i in range(sheettwo.nrows):
     z = i + 1
     toprint = """formatting of the data im writing. important stuff is to the right -> """ + str(sheettwo.cell(z,y).value) + """ more formatting! """ + str(sheettwo.cell(z,x).value.encode('utf-8')) + """ and done"""
     out.write(toprint)
     out.write("\n")

где x и y - произвольные ячейки в этом случае, причем x меньше произвольных и содержит символы utf-8

До сих пор я использовал .encode ('utf-8') только в ячейках, где я знаю, что в противном случае будут ошибки, или я предвидел ошибку без использования utf-8.

Мой вопрос в основном таков: есть ли недостаток в использовании .encode ('utf-8') во всех ячейках, даже если это не нужно? Эффективность не проблема. главная проблема заключается в том, что он работает, даже если в месте, где его не должно быть, находится символ utf-8. Если не произойдет никаких ошибок, если я просто добавлю «.encode ('utf-8')» в каждое чтение ячейки, я, вероятно, в конечном итоге сделаю это.

Ответы [ 2 ]

4 голосов
/ 13 октября 2011

Документация XLRD четко гласит: «Начиная с Excel 97, текст в таблицах Excel хранится в формате Unicode».Так как вы, скорее всего, читаете в файлах новее 97, они все равно содержат кодовые точки Unicode.Поэтому необходимо хранить содержимое этих ячеек как Unicode в Python и не преобразовывать их в ASCII (что вы делаете с помощью функции str ()).Используйте этот код ниже:

book = open_workbook('file.xls')
sheettwo = book.sheet_by_index(1)
#Make sure your writing Unicode encoded in UTF-8
out = open('output.file', 'w')
for i in range(sheettwo.nrows):
    z = i + 1
    toprint = u"formatting of the data im writing. important stuff is to the right -> " + unicode(sheettwo.cell(z,y).value) + u" more formatting! " + unicode(sheettwo.cell(z,x).value) + u" and done\n"
    out.write(toprint.encode('UTF-8'))
0 голосов
/ 30 октября 2011

Этот ответ на самом деле представляет собой несколько мягких комментариев к принятому ответу, но они нуждаются в лучшем форматировании, чем обеспечивает средство комментариев SO.

(1) Отказ от горизонтальной полосы прокрутки SO повышает вероятность того, что люди будут читать вашкод.Попробуйте обернуть строки, например:

toprint = u"".join([
    u"formatting of the data im writing. "
    u"important stuff is to the right -> ",
    unicode(sheettwo.cell(z,y).value),
    u" more formatting! ",
    unicode(sheettwo.cell(z,x).value),
    u" and done\n"
    ])
out.write(toprint.encode('UTF-8'))

(2) Предположительно, вы используете unicode() для преобразования чисел с плавающей запятой и целых в unicode;это ничего не делает для значений, которые уже являются Unicode.Имейте в виду, что unicode(), как и str (), дает вам только 12 цифр точности для чисел с плавающей запятой:

>>> unicode(123456.78901234567)
u'123456.789012'

Если это беспокоит, вы можете попробовать что-то вроде этого:

>>> def full_precision(x):
>>> ... return unicode(repr(x) if isinstance(x, float) else x)
>>> ...
>>> full_precision(u'\u0400')
u'\u0400'
>>> full_precision(1234)
u'1234'
>>> full_precision(123456.78901234567)
u'123456.78901234567'

(3) xlrd строит Cell объектов на лету, когда это требуется.

sheettwo.cell(z,y).value # slower
sheettwo.cell_value(z,y) # faster
...