Как мне прочитать файл Excel в Python, используя xlrd? Может ли он читать новые форматы Office? - PullRequest
11 голосов
/ 23 сентября 2008

Моя проблема ниже, но были бы интересны комментарии от любого, кто имеет опыт работы с 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? План Б?

Ответы [ 5 ]

26 голосов
/ 29 марта 2009

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

  1. Файл 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'
    

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

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

  3. pyExcelerator заброшен - xlrd и xlwt живы и здоровы. Проверить http://groups.google.com/group/python-excel

НТН John

3 голосов
/ 07 ноября 2008

xlrd Поддержка формата Office 2007/2008 (OpenXML) в альфа-тесте - см. Следующий пост в группе новостей python-excel: http://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=en

1 голос
/ 24 сентября 2008

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

import pyExcelerator
book = pyExcelerator.parse_xls(filename)

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

Данные рабочего листа - это словарь, где ключи - это пары (строка, столбец) (начиная с 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), так что сделайте несколько проб и ошибок, чтобы проверить. Я думаю, что даты хранятся как числа с плавающей точкой (дни и доли дня).

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

0 голосов
/ 23 сентября 2008

Вы должны использовать xlrd? Я только что загрузил «ОБНОВЛЕНО - Dow Jones Industrial Average Movers - 2008» с этого веб-сайта и без проблем прочитал его с pyExcelerator .

import pyExcelerator
book = pyExcelerator.parse_xls('DJIAMovers.xls')
0 голосов
/ 23 сентября 2008

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

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

...