11

私の問題は以下のとおりですが、xlrd の経験がある方からのコメントに興味があります。

xlrd を見つけたところ、完璧なソリューションのように見えますが、開始するのに少し問題があります。Dow Jones Industrial Average (リンク: http://www.djindexes.com/mdsidx/?event=showAverages )の現在のコンポーネントを使用して、Dow Jones から取得した Excel ファイルからプログラムでデータを抽出しようとしています。

ファイルを変更せずに開くと、厄介なBIFFエラーが発生します(バイナリ形式が認識されません)

ただし、このスクリーンショットでは、Excel 2008 for Mac が「Excel 1997-2004」形式であると認識していることがわかります (スクリーンショット: http://skitch.com/alok/ssa3/componentreport-dji.xls-properties ) 。

代わりに Excel で手動で開き、「Excel 1997-2004」形式で明示的に保存してから、xlrd を使用して python で開くと、すべてが素晴らしいものになります。Office は、ファイルが既に 'Excel 1997-2004' 形式であると認識していることに注意してください。すべてのファイルは .xls です

これは、問題を再現する ipython セッションのペーストビンです: http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq

についての考え: データを抽出できるように、xlrd をだましてファイルを認識させるにはどうすればよいですか? Python を使用して、明示的な「名前を付けて保存」形式を xlrd が受け入れる形式に自動化する方法は? 次の手段?

4

5 に答える 5

26

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'
    

    このファイルは、Pythonのcsvモジュールを使用して読み取ることができます...delimiter="\t"への呼び出しで使用するだけcsv.reader()です。

  2. xlrdは、pyExceleratorが読み取ることができるすべてのファイルを読み取ることができ、それらをより適切に読み取ることができます。日付は浮動小数点数として出力されません。Excelの日付に関する詳細は、xlrdのドキュメントに記載されています。

  3. pyExceleratorはアバンダンウェアです—xlrdとxlwtは健在です。http://groups.google.com/group/python-excelをチェックしてください

HTHジョン

于 2009-03-29T14:21:13.750 に答える
3

Office 2007/2008 (OpenXML) 形式の xlrd サポートはアルファ テスト中です。python-excel ニュースグループの次の投稿を参照してください: http://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=en

于 2008-11-07T14:14:03.777 に答える
1

pyExcelerator の詳細: ファイルを読み取るには、次のようにします。

import pyExcelerator
book = pyExcelerator.parse_xls(filename)

filename は、読み取るファイル名の文字列です (ファイルのようなオブジェクトではありません)。これにより、ワークブックを表すデータ構造 (ペアのリスト) が得られます。ペアの最初の要素はワークシート名で、2 番目の要素はワークシート データです。

ワークシート データはディクショナリで、キーは (行、列) のペア (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 は Lotus との互換性のために 1900 年をうるう年として扱い、 1900-1-1 が 0 なのか 1 なのか思い出せないので、試行錯誤して確認してください。日時はフロートとして保存されていると思います(日と1日の端数)。

フォーラムには部分的なサポートがあると思いますが、何も保証しません。

于 2008-09-24T02:05:29.457 に答える
0

さて、ここに私が行ったいくつかのコードがあります: (一番下を見てください): here

新しいフォーマットについては不明 - xlrd が読み取れない場合は、xlrd の新しいバージョンをリリースする必要があります。

于 2008-09-23T01:14:51.067 に答える
-1

xlrdを使用する必要がありますか?そのウェブサイトから「UPDATED-DowJonesIndustrial Average Movers-2008」をダウンロードしたところ、pyExceleratorで問題なく読むことができました。

import pyExcelerator
book = pyExcelerator.parse_xls('DJIAMovers.xls')
于 2008-09-23T02:33:40.647 に答える