2017-08-08 30 views
0

別のシステムで作成されたxlsxファイルを開こうとしています(これは、常にデータが入ってきて、自分の制御ではありません)。私はopenpyxl(v2.3.2)とxlrd(v1.0.0)(pandas(v0.20.1)read_excelとpd.ExcelFile()の両方ともxlrdを使用しているので、mootかもしれません)、私はエラーが発生しています。私の検索から答えを見つけられない。どんな助けもありがとうございます。pythonでxlsxファイルを開く際にエラーが発生しました

xlrdコード:

import xlrd 
workbook = xlrd.open_workbook(r'C:/Temp/Data.xlsx') 

エラー:

Traceback (most recent call last): 

    File "<ipython-input-3-9e5d87f720d0>", line 2, in <module> 
    workbook = xlrd.open_workbook(r'C:/Temp/Data.xlsx') 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\__init__.py", line 422, in open_workbook 
    ragged_rows=ragged_rows, 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 833, in open_workbook_2007_xml 
    x12sheet.process_stream(zflo, heading) 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 548, in own_process_stream 
    self_do_row(elem) 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 685, in do_row 
    self.sheet.put_cell(rowx, colx, None, float(tvalue), xf_index) 

ValueError: could not convert string to float: 

openpyxlコード:

import openpyxl 
wb = openpyxl.load_workbook(r'C:/Temp/Data.xlsx') 

エラー:

Traceback (most recent call last): 

    File "<ipython-input-2-6083ad2bc875>", line 1, in <module> 
    wb = openpyxl.load_workbook(r'C:/Temp/Data.xlsx') 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 234, in load_workbook 
    parser.parse() 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\worksheet.py", line 106, in parse 
    dispatcher[tag_name](element) 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\worksheet.py", line 243, in parse_row_dimensions 
    self.parse_cell(cell) 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\worksheet.py", line 188, in parse_cell 
    value = _cast_number(value) 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 23, in _cast_number 
    return long(value) 

ValueError: invalid literal for int() with base 10: ' ' 

パンダコード:

import pandas as pd 
df = pd.read_excel(r'C:/Temp/Data.xlsx', sheetname='Sheet1') 

エラー:

Traceback (most recent call last): 

    File "<ipython-input-5-b86ec98a4e9e>", line 2, in <module> 
    df = pd.read_excel(r'C:/Temp/Data.xlsx', sheetname='Sheet1') 

    File "C:\Program Files\Anaconda3\lib\site-packages\pandas\io\excel.py", line 200, in read_excel 
    io = ExcelFile(io, engine=engine) 

    File "C:\Program Files\Anaconda3\lib\site-packages\pandas\io\excel.py", line 257, in __init__ 
    self.book = xlrd.open_workbook(io) 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\__init__.py", line 422, in open_workbook 
    ragged_rows=ragged_rows, 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 833, in open_workbook_2007_xml 
    x12sheet.process_stream(zflo, heading) 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 548, in own_process_stream 
    self_do_row(elem) 

    File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 685, in do_row 
    self.sheet.put_cell(rowx, colx, None, float(tvalue), xf_index) 

ValueError: could not convert string to float: 

その価値が、ここでは、入力ファイルの例の抜粋である何のために: Input file example

私はエラーがから来ていることを推測しています最初の2行と3行を削除するとエラーがなくなるため、最初の行は最初の列を超えて空白があります。最初の2行をスキップすることはできません。セルA1の値を抽出したいからです。私はまた、読み込まれた値を文字列型にすることを強制したいと思いますし、後でエラーチェックで浮動小数点に変換します。ありがとう!

===========

更新(8月9日午前10時EDT):チャーリーの提案を使用して、読み取り専用モードでExcelファイルを開くことができました。ほとんどのコンテンツを読むことができましたが、まだどこかでエラーが発生しています。 新しいコード(申し訳ありません、それは非常にニシキヘビではありません - まだ初心者):

wb = openpyxl.load_workbook(r'C:/Temp/Data.xlsx', read_only=True) 
ws = wb['Sheet1'] 
ws.max_row = ws.max_column = None 

i=1 
for row in ws.rows: 
    for cell in row: 
     if i<2000: 
      i += 1 
      try: 
       print(i, cell.value) 
      except: 
       print("error") 

エラー:

Traceback (most recent call last): 

    File "<ipython-input-65-2e8f3cf2294a>", line 2, in <module> 
    for row in ws.rows: 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\worksheet\read_only.py", line 125, in get_squared_range 
    yield tuple(self._get_row(element, min_col, max_col)) 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\worksheet\read_only.py", line 165, in _get_row 
    value, data_type, style_id) 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 36, in __init__ 
    self.value = value 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 132, in value 
    value = _cast_number(value) 

    File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 23, in _cast_number 
    return long(value) 

ValueError: invalid literal for int() with base 10: ' ' 

=========

アップデート2(10:35 ):ファイルを読み取って ws.max_rowとws.max_columnをNoneに設定していない場合、コードはエラーなしで1つの列だけを読み取っていました。セルA66の値は "Generated from:"です。しかし、ファイル ws.max_rowとws.max_columnをNoneと設定して読むと、この特定のセルが問題を引き起こしています。しかし、私はその前に他のすべての細胞を読むことができ、それは今、私のためにうまくいくでしょう。ありがとう、@チャーリー。

+0

[編集]あなたの質問を使用している 'openpyxl'のバージョンを追加してください。ありがとう、@oliver。 – stovfl

答えて

1

が鳴ります。openpyxlの読み取り専用モードを使用して、最初の牽引行をスキップすることができます。

+0

ありがとう、@チャーリー。これは有望です。これでファイルをこのように開くことができました。しかし、それは最初の列だけを読んでいました。 max_row = max_column = Noneと設定し、より多くのデータを読み取ることができました。まだ読み込みのどこかでValueErrorを取得します。私は詳細で質問を更新します。これ以上のアイデアは? – ram

+1

ワークシートのようなサウンドには、dimension属性が無効です。ソースを確認する必要があります。 openpyxlに強制的にディメンションを再計算させた後、 'iter_rows(min_row = 3)'を使用するか、完了したときに手動でリセットしてください。そして、より良いライブラリを使用するためにファイルの提供者を悩ませます。 –

0

最初の2行を削除した後にプログラムが機能する場合は、スキップしてください。 skiprowsを使用して、空白またはヘッダーである最初の2行を無視してみてください。パンダのparseメソッドを使用できます。ソースファイルが破損している可能性があり、空の文字列を数値として入力されたセルが含まれているよう

xls = pd.read_excel('C:/Temp/Data.xlsx') 

df = xls.parse('Sheet1', skiprows=2) #assuming your data is on sheet1. 
+0

コードの最初の行を実行すると、まったく同じエラーがスローされます(header = Noneを設定しても)。 – ram

+0

ファイルへのパスで 'pd.ExcelFile()'を試してみたらどうでしょう? –

+0

でも同じエラーが発生します。たとえヘッダー=なしでも – ram

関連する問題