Подтвердить что ты не робот

Как читать файл Excel в Python с помощью xlrd? Может ли он читать новые форматы Office?

Моя проблема ниже, но будут интересны комментарии от любого, у кого есть опыт работы с xlrd.

Я только что нашел xlrd, и это похоже на идеальное решение, но у меня возникла небольшая проблема при запуске. Я пытаюсь извлечь данные программно из файла Excel, который я вытащил из Dow Jones, с текущими компонентами промышленного индекса Dow Jones (ссылка: http://www.djindexes.com/mdsidx/?event=showAverages)

Когда я открываю файл без изменений, я получаю неприятную ошибку BIFF (двоичный формат не распознается)

Однако вы можете видеть на этом скриншоте, что Excel 2008 для Mac считает, что он находится в формате Excel 1997-2004 (снимок экрана: http://skitch.com/alok/ssa3/componentreport-dji.xls-properties)

Если я вместо этого открываю его в Excel вручную и автоматически сохраняю как формат Excel 1997-2004, тогда откройте в python usig xlrd, все замечательно. Помните, Office считает, что файл уже находится в формате Excel 1997-2004. Все файлы:.xls

Ниже приведена ссылка на сеанс ipython, реплицирующий проблему: http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq

Любые мысли о: Как обмануть xlrd в распознавании файла, чтобы я мог извлечь данные? Как использовать python для автоматизации явного формата "Сохранить как" на том, который примет xlrd? План B?

4b9b3361

Ответ 1

FWIW, я автор xlrd и сопровождающий xlwt (вилка pyExcelerator). Несколько моментов:

  • Файл ComponentReport-DJI.xls не указан; это не файл XLS, это файл с разделителями табуляции. Откройте его с помощью текстового редактора (например, "Блокнот" ), и вы поймете, что я имею в виду. Вы также можете посмотреть не очень сырые исходные байты с Python:

    >>> open('ComponentReport-DJI.xls', 'rb').read(200)
    'COMPANY NAME\tPRIMARY EXCHANGE\tTICKER\tSTYLE\tICB SUBSECTOR\tMARKET CAP RANGE\
    tWEIGHT PCT\tUSD CLOSE\t\r\n3M Co.\tNew York SE\tMMM\tN/A\tDiversified Industria
    ls\tBroad\t5.15676229508\t50.33\t\r\nAlcoa Inc.\tNew York SE\tA'
    

    Вы можете прочитать этот файл, используя модуль Python csv... просто используйте delimiter="\t" в своем обращении к csv.reader().

  • xlrd может читать любые файлы, которые pyExcelerator может, и читать их лучше, даты не выходят как float, а полная история о датах Excel - в документации xlrd.

  • pyExcelerator - это отказоустойчивость, xlrd и xlwt являются живыми и здоровыми. Проверьте http://groups.google.com/group/python-excel

НТН Джон

Ответ 3

Дополнительная информация о pyExcelerator: Чтобы прочитать файл, сделайте следующее:

import pyExcelerator
book = pyExcelerator.parse_xls(filename)

где filename - это строка, которая является именем файла для чтения (а не файлоподобным объектом). Это даст вам структуру данных, представляющую рабочую книгу: список пар, где первым элементом пары является имя рабочего листа, а второй элемент - данные рабочего листа.

Данные рабочего листа - это словарь, в котором ключи (строки, col) (начиная с 0), а значения - содержимое ячейки - обычно int, float или string. Так, например, в простом случае всех данных, находящихся на первом листе:

data = book[0][1]
print 'Cell A1 of worksheet %s is: %s' % (book[0][0], repr(data[(0, 0)]))

Если ячейка пуста, вы получите KeyError. Если вы имеете дело с датами, они могут (я забыл) прийти как целые числа или поплавки; если это так, вам нужно будет преобразовать. В основном правило: datetime.datetime(1899, 12, 31) + datetime.timedelta(days = n), но это может быть отключено на 1 или 2 (поскольку Excel рассматривает 1900 как високосный год для совместимости с Lotus, а потому Я не могу вспомнить, является ли 1900-1-1 0 или 1), поэтому проверьте некоторые пробные ошибки и ошибки. Времена сохраняются как поплавки, я думаю (дни и доли дня).

Я думаю, что есть частичная поддержка форумов, но я ничего не гарантирую.

Ответ 4

Ну вот код, который я сделал: (смотрите вниз): здесь

Не уверен в более новых форматах - если xlrd не может его прочитать, для xlrd должна быть выпущена новая версия!

Ответ 5

Вам нужно использовать xlrd? Я только что загрузил "UPDATED - Dow Jones Industrial Average Movers - 2008" с этого сайта и не стал читать его с помощью pyExcelerator.

import pyExcelerator
book = pyExcelerator.parse_xls('DJIAMovers.xls')