簡體   English   中英

在python中打開xlsx文件時出錯

[英]error opening xlsx files in python

我正在嘗試打開由另一個系統創建的xlsx文件(這是數據總是以這種格式出現的,並且不在我的控制范圍內)。 我嘗試了openpyxl(v2.3.2)和xlrd(v1.0.0)(以及pandas(v0.20.1)read_excel和pd.ExcelFile(),它們都使用xlrd,所以可能沒有意義),我遇到錯誤; 加上沒有從我的搜索中找到答案。 任何幫助表示贊賞。

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: 

為了說明其價值,這是輸入文件的示例片段: 輸入文件示例

我猜測錯誤是來自第一行的第一行以外有空白的錯誤-因為刪除前兩行和時錯誤消失了。 我不能跳過前兩行,因為我想提取單元格A1中的值。 我還想強制將讀取的值設置為字符串類型,然后稍后將通過錯誤檢查將其轉換為float。 謝謝!

===========

更新(美國東部時間8月9日上午10點):根據查理的建議,能夠以只讀模式打開excel文件; 並且能夠讀取大多數內容-但仍然在某處遇到錯誤。 新代碼(對不起,它不是pythonic-還是新手):

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: ' '

=========

Update2(10:35 AM):當我讀取的文件沒有 ws.max_row並且ws.max_column設置為None時,代碼僅讀取一列,沒有錯誤。 單元格A66中的值為“ Generated from”。 但是,當我在將ws.max_row和ws.max_column設置為None的情況下讀取文件 ,此特定單元格引起了麻煩。 但在此之前,我可以讀取所有其他單元格,並且對我而言現在可以正常工作。 謝謝@查理。

聽起來源文件可能已損壞,並且包含帶有空字符串並鍵入為數字的單元格。 您可能可以使用openpyxl的只讀模式跳過前兩行。

如果您的程序在刪除前兩行后仍然有效,那么請跳過它們。 嘗試使用skiprows行來忽略前兩行為空白或標頭。 您可以使用panda的parse方法。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM