2017-12-01 9 views
0

Excel 파일에서 형식이 지정된 텍스트를 읽으려고합니다. 그것은 일련의 반응들로 이루어져 있으며, 일부 반응물들은 첨자를 가지고있는 반면, 다른 반응물들은 첨자를 가지고있다. 나는 위첨자와 아래 첨자를 구별하기 위해 고심하고있다.Python 판다를 사용하여 Excel 파일에서 하위/위 첨자 읽기

예를 들어, 반응물은 말 :

O2+

내가 여기에 관련 질문이

O2+

구별 할이에서 Usage of unicode() and encode() functions in Python

, 나는 생각 어쩌면 내가 유니 코드로 문자열을 변환해야하지만 팬더는 위 첨자/아래 첨자를 전혀 읽지 않는 것 같습니다.

+0

그래서 텍스트는 아래 첨자 및 위 첨자 글꼴 옵션을 사용하여 셀 내에서 서식이 지정됩니까? – James

+0

맞아요. – rahulv88

+0

O2 +와 O2 +가되어야할까요? –

답변

0

팬더는 xlrd를 사용하여 Excel 파일을 읽으며, 불행히도 xlrd는 셀 내에서 사용 된 형식을 구문 분석하지 않습니다.

openpyxl 패키지는 문자열 형식을 처리 할 수 ​​있지만 이전 .xls 형식 만 처리 할 수 ​​있습니다. 기본 XML 데이터를 보는 사용자 정의 파서를 작성해야 할 것입니다.

.xlsx 파일은 xml 파일 모음을 포함하는 zip 아카이브 일뿐입니다. 당신이 볼 필요 두 사람은

  • file.xlsx/XL/sharedStrings.xml
  • file.xlsx/XL/워크 시트/sheet1.xml 있습니다 (또는 시트의 이름은 무엇이든)

    첫 번째 파일의 문자열은 이고 형식은입니다. 두 번째 파일에는 시트의 셀과 참조하는 문자열이 포함됩니다. 문자열은 sharedStrings.xml에서 순서대로 참조됩니다.

    enter image description here

    예 sharedStrings.xml 파일 :

    <?xml version="1.0" encoding="UTF-8"?> 
    <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="3"> 
        <si> 
        <r> 
         <t>O</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="subscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>2</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="superscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>+</t> 
        </r> 
        </si> 
        <si> 
        <r> 
         <t>H</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="subscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>2</t> 
        </r> 
        <r> 
         <rPr> 
         <sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>O</t> 
        </r> 
        </si> 
        <si> 
        <r> 
         <t>O</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="superscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>2+</t> 
        </r> 
        </si> 
    </sst> 
    

    <si> 요소는 텍스트의 덩어리가 여기

    은 일례의 스크린 캡 시트 탁월하다. <r> 요소는 일련의 문자 및 서식입니다. <t> 요소가 실제 문자이며, 앞에있는 <rPr> 요소는 스타일/서식입니다. <vertAlign> 요소에서 위 첨자와 아래 첨자가 언제 구분되는지 구분할 수 있습니다. sheet1.xml의

    예 :

    <?xml version="1.0" encoding="UTF-8"?> 
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac"> 
        <dimension ref="A1:A3" /> 
        <sheetViews> 
        <sheetView tabSelected="1" workbookViewId="0"> 
         <selection activeCell="A4" sqref="A4" /> 
        </sheetView> 
        </sheetViews> 
        <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25" /> 
        <sheetData> 
        <row r="1" spans="1:1" ht="18.75" x14ac:dyDescent="0.35"> 
         <c r="A1" t="s"> 
         <v>0</v> 
         </c> 
        </row> 
        <row r="2" spans="1:1" ht="18" x14ac:dyDescent="0.35"> 
         <c r="A2" t="s"> 
         <v>1</v> 
         </c> 
        </row> 
        <row r="3" spans="1:1" ht="17.25" x14ac:dyDescent="0.25"> 
         <c r="A3" t="s"> 
         <v>2</v> 
         </c> 
        </row> 
        </sheetData> 
        <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3" /> 
        <pageSetup orientation="portrait" r:id="rId1" /> 
    </worksheet> 
    

    <row> 요소 내에 포함 <c> 셀 소자. <v> 값은 공유 문자열의 순서/색인에 대한 참조입니다. 따라서 셀 A1은 0 번째 공유 문자열의 값을 가지며 0에 이어 2이라는 첨자가 붙고 그 다음에 위 첨자 +이옵니다.: Excel 파일을 구문 분석을 시작하려면

    <si> 
    <r> 
        <t>O</t> 
    </r> 
    <r> 
        <rPr> 
        <vertAlign val="subscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
        </rPr> 
        <t>2</t> 
    </r> 
    <r> 
        <rPr> 
        <vertAlign val="superscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
        </rPr> 
        <t>+</t> 
    </r> 
    </si> 
    

    , 당신은 사용할 수 있습니다

    import zipfile 
    from lxml import etree 
    
    z = zipfile.ZipFile('file.xlsx') 
    
    with z.open('xl/sharedStrings.xml') as fp: 
        ss = etree.fromstring(fp.read()) 
    
    with z.open('xl/worksheets/sheet1.xml') as fp: 
        sh1 = etree.fromstring(fp.read()) 
    
    z.close() 
    
    # get the namespaces 
    ssns = ss.nsmap 
    if None in ssns: 
        ssns['none'] = ssns.pop(None) 
    
    sh1ns = sh1.nsmap 
    if None in sh1ns: 
        sh1ns['none'] = sh1ns.pop(None) 
    
    text_list = ss.xpath('//none:si', namespaces=ssns) 
    cell_list = sh1.xpath('//none:c', namespaces=sh1ns) 
    

    당신은 당신이 원하는 형식으로 포맷을 변환하는 파서를 작성해야합니다.

+0

파일을 'xls'로 저장하고 openpyxl을 사용하면 더 쉬울까요? – rahulv88

+0

사실 내가 그랬을 때 오류가 발생했다. openpyxl은 xls 형식을 지원하지 않는다고한다. – rahulv88