code

팬더 하이퍼링크로 읽기_excel

starcafe 2023. 10. 30. 21:09
반응형

팬더 하이퍼링크로 읽기_excel

Excel 스프레드시트를 사용하여 Pandas DataFrame:

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

그러나 스프레드시트의 열 중 하나에 하이퍼링크가 연결된 텍스트가 들어 있습니다.Pandas에서 기본 하이퍼링크에 액세스하려면 어떻게 해야 합니까?

이것은 오픈pyxl로 할 수 있습니다. 팬더로도 가능한지 전혀 모르겠습니다.제가 한 방법은 이렇습니다.

import openpyxl

wb = openpyxl.load_workbook('yourfile.xlsm')
sheets = wb.sheetnames
ws = wb[sheets[0]]
# Deprecation warning
# 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.탭을 눌러 개체에서 액세스하거나 사용할 수 있는 작업에 대한 모든 옵션을 확인할 수 있습니다.

변환기나 이런 것이 없는 빠른 원숭이 패치를 적용하는 것입니다. 하이퍼링크가 있는 모든 셀을 하이퍼링크로 취급하고 싶다면, 적어도 하이퍼링크로 취급할 열을 선택하거나 데이터를 수집하거나 데이터 프레임의 동일한 셀에 데이터와 하이퍼링크를 모두 저장할 수 있습니다.변환기를 이용해서, 몰라요. (BTW 나도 같이 놀았어요.)data_only,keep_links, 도움이 되지 않았고, 단지 변화할 뿐입니다.read_only결과는 OK, 코드 속도를 늦출 수 있을 것 같습니다).

추신: xlsx에서만 작동합니다. 즉, 엔진이 오픈pyxl입니다.

P.P.S: 앞으로 이 댓글을 읽고 https://github.com/pandas-dev/pandas/issues/13439 을 발행해도 계속 열리면 다음 내용의 변경 사항을 확인하는 것을 잊지 마십시오._convert_cell그리고.load_workbookpandas.io.excel._openpyxl이에 따라 업데이트합니다.

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)

이 모든 것을 쓰고 나니, 아마 오픈pyxl을 혼자 사용하는 것이 더 쉽고 깨끗해질 것이라는 생각이 들었습니다 ^_^

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

팬더에서는 그렇게 할 수 없습니다.Excel 파일을 다루도록 설계된 다른 라이브러리로 시도해 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/35325799/pandas-read-excel-with-hyperlink

반응형