带有超链接的 Pandas read_excel

Posted

技术标签:

【中文标题】带有超链接的 Pandas read_excel【英文标题】:Pandas read_excel with Hyperlink 【发布时间】:2016-05-21 10:19:43 【问题描述】:

我有一个 Excel 电子表格,我正在将其读入 Pandas DataFrame:

df = pd.read_excel("file.xls")

但是,电子表格的其中一列包含具有与其关联的超链接的文本。如何访问 Pandas 中的底层超链接?

【问题讨论】:

我不确定您在寻找什么或示例行将如何提供帮助。想象一个只有一个带有文本的单元格的 Excel 电子表格。该文本是 Excel 中的可点击超链接。文本可以是字母“A”并且可以在 Excel 中点击,但 pd.read_excel 只抓取字母“A”而不是底层超链接。 【参考方案1】:

你不能在 pandas 中做到这一点。你可以试试other libraries designed to deal with excel files。

【讨论】:

【参考方案2】:

正如 slaw 所说,它不抓取超链接,而只抓取文本

这里的 text.xlsx 包含第 9 列中的链接

from openpyxl import load_workbook
workbook = load_workbook('test.xlsx')
worksheet = workbook.active

column_indices = [9]

for row in range(2, worksheet.max_row + 1):
    for col in column_indices:
        filelocation = worksheet.cell(column=col, row=row)  # this is hyperlink
        text = worksheet.cell(column=col + 1, row=row)  # thi is your text 
        worksheet.cell(column=col + 1, row=row).value = '=HYPERLINK("' + filelocation.value + '","' + text.value + '")'

workbook.save('test.xlsx')

【讨论】:

那是 openpyxl 对吧?你为什么要写工作表?我以为我们想从中读取链接?此外,超链接在同一个单元格中,而不是下一列。文本本身有一个超链接。【参考方案3】:

这可以用 openpyxl 完成,我不确定它是否可以用 Pandas 完成。以下是我的做法:

import openpyxl

wb = openpyxl.load_workbook('yourfile.xlsm')
ws = wb.get_sheet_by_name('Sheet1')
print(ws.cell(row=2, column=1).hyperlink.target)

您也可以使用 iPython,并设置一个等于超链接对象的变量:

t = ws.cell(row=2, column=1).hyperlink

然后执行t. 并按 Tab 键查看您可以使用该对象执行的操作或访问的所有选项。

【讨论】:

wb.get_sheet_by_name 已贬值 使用 wb[sheetname] 代替【参考方案4】:

快速猴子补丁,没有转换器或类似的东西,如果你想将所有带有超链接的单元格视为超链接,我想更复杂的方式,至少能够选择,哪些列被视为超链接或收集数据,或以某种方式将数据和超链接保存在数据框的同一单元格中。并使用转换器,不知道。 (顺便说一句,我也玩过data_onlykeep_links,没有帮助,只更改了read_only 结果没问题,我想它会减慢你的代码速度)。

P.S.:仅适用于 xlsx,即引擎是 openpyxl

P.P.S.:如果您以后阅读此评论并发出 https://github.com/pandas-dev/pandas/issues/13439 仍然打开,请不要忘记在 pandas.io.excel._openpyxl 上查看 _convert_cellload_workbook 的更改并相应地更新它们。

import pandas
from pandas.io.excel._openpyxl import OpenpyxlReader
import numpy as np
from pandas._typing import FilePathOrBuffer, Scalar


def _convert_cell(self, cell, convert_float: bool) -> Scalar:
    from openpyxl.cell.cell import TYPE_BOOL, TYPE_ERROR, TYPE_NUMERIC
    # here we adding this hyperlink support:
    if cell.hyperlink and cell.hyperlink.target:
        return cell.hyperlink.target
        # just for example, you able to return both value and hyperlink,
        # comment return above and uncomment return below
        # btw this may hurt you on parsing values, if symbols "|||" in value or hyperlink.
        # return f'cell.value|||cell.hyperlink.target'
    # here starts original code, except for "if" became "elif"
    elif cell.is_date:
        return cell.value
    elif cell.data_type == TYPE_ERROR:
        return np.nan
    elif cell.data_type == TYPE_BOOL:
        return bool(cell.value)
    elif cell.value is None:
        return ""  # compat with xlrd
    elif cell.data_type == TYPE_NUMERIC:
        # GH5394
        if convert_float:
            val = int(cell.value)
            if val == cell.value:
                return val
        else:
            return float(cell.value)

    return cell.value


def load_workbook(self, filepath_or_buffer: FilePathOrBuffer):
    from openpyxl import load_workbook
    # had to change read_only to False:
    return load_workbook(
        filepath_or_buffer, read_only=False, data_only=True, keep_links=False
    )


OpenpyxlReader._convert_cell = _convert_cell
OpenpyxlReader.load_workbook = load_workbook

在您的 python 文件中添加上述内容后,您将能够调用df = pandas.read_excel(input_file)

写完所有这些东西后,我想到了,也许只使用openpyxl会更容易和更清洁^_^

【讨论】:

更新了代码,因此它适用于 pandas 1.4.0,请参阅 github 问题链接:github.com/pandas-dev/pandas/issues/…

以上是关于带有超链接的 Pandas read_excel的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 和 Jupyter Notebook 中创建带有指向本地文件的可单击超链接的表

如何使用 Pandas 在列中添加值的超链接?

Python Pandas str.contains() 行中带有超链接

Python Pandas:使用正则表达式用超链接替换字符串

将超链接添加到由 pandas 数据框 to_excel 方法创建的 excel 表

带有图像和文本的 HTML 超链接