Módulo Python para analisar arquivos Apple Numbers .numbers
Dezembro 31, 2021

Módulo Python para analisar arquivos Apple Numbers .numbers

Por Ricardo Marques
Ad

analisador de números é um módulo Python para analisar Apple Numbers . numbers arquivos. Ele suporta arquivos do Numbers gerados pela versão 10.3 do Numbers e todos os 11.x até 11.2 (atual em novembro de 2021).

Ele suporta e é testado em versões Python de 3.6 em diante. Não é compatível com versões anteriores do Python.

Recursos atualmente suportados dos arquivos do Numbers são:

    Várias páginas por documento

  • Várias tabelas por folha
  • Texto, numérico, data, moeda, duração, tipos de células de porcentagem
  • As fórmulas têm suporte muito limitado e dependem totalmente do Numbers salvando valores nas células como parte do documento salvo, o que nem sempre é garantido. Quando um valor de fórmula não está presente, o valor FORMULA é retornado. Qualquer fórmula que resulte em um erro do Numbers retorna um valor ERROR .

    Instalação

    python3 -m números de instalação de pip -parser

    Lendo documentos:

    .tables () rows=tables .rows () "> a partir de

    numbers_parser importar Documento

    doc [1] =

    Documento

    ( "my-spreasdsheet.numbers"

    ) folhas =["Sheet 1"]=["Sheet 1"]

    doc . folhas ()

    tabelas

    ["Sheet 1"] =

    folhas[0].

    tabelas ["Sheet 1"] () linhas

    =

    tabelas [0]. linhas

    ()

    Referente a planilhas e tabelas

    [fast-formula-parser] Ambas as planilhas e nomes podem ser acessados ​​a partir de listas desses objetos usando um índice inteiro ( lista e usando o nome da planilha / tabela ( dict

      sintaxe): print ("Folha aberta", folha_1.name) # dict método de acesso table_1=folhas ["Table 1"] print ("Tabela aberta", table_1.name) "> # método de acesso à lista sheet_1 ["Sheet 1"] =

      doc

      . folhas () [0] imprimir( "Folha aberta" [1] , sheet_1 .nome

      )

      # método de acesso dict tabela 1 folhas ["Table 1"] imprimir( "Mesa aberta"

      ,

      tabela 1.nome)

Acessando dados

Mesa objetos têm um método rows que contém uma lista aninhada com uma entrada para cada linha da tabela. Cada linha é uma lista dos valores da coluna. As células vazias no Numbers são retornadas como Nenhuma valores.

) print ("Célula C2 contém", data [2] [1]) ">

  dados =

folhas["Table 1"].

linhas () imprimir ( "A célula A1 contém"

, dados

[0] [0]) imprimir (

" A célula C2 contém "

, dados

[2] [1])

Referências de células

Além de extrair todos os dados de uma vez, células individuais podem ser chamadas de métodos

  doc  =Documento

( "my-spreasdsheet.numbers" ) folhas

= doc

. ["Sheet 1"]. folhas

() tabelas

=

folhas ["Sheet 1"].

tabelas () tabela =

tabelas

["Table 1"] # linha, sintaxe de coluna

imprimir ( Célula A1) "Célula A1 contém"

, tabela. célula( 0 , 0

)) de células no estilo Excel / Numbers

imprimir ( da célula C2) "A célula C2 contém "

, tabela

. célula(

"C2"

))

Células mescladas

Ao extrair dados usando data () células mescladas são ignoradas, pois apenas valores de texto são retornados. O método cell () de Objetos Tabela

    retorna um Cell
      tipo de objeto que é digitado pelo tipo de célula na tabela Números. Objetos MergeCell indica células removidas em um mesclar. }, {cell.size [1]}) ">
  doc [1]  = 

Documento

( "my-spreasdsheet.numbers"

) folhas =["Sheet 1"]=["Sheet 1"]
doc .folhas

() tabelas

=[TSPRegistry sharedRegistry]
folhas ["Sheet 1"]. tabelas () tabela

=

tabelas

["Table 1"] célula =

tabela. célula (

"A1"

) imprimir(célula

.

merge_range ) imprimir( f "O tamanho da mesclagem da célula A1 é
{célula

. Tamanho [0]

} , { célula

.
Tamanho [1] }

)

Iteradores de linha e coluna

As tabelas têm iteradores para iteração por linha e por coluna, com cada iterador retornando uma lista das células nessa linha ou coluna

 por fileira dentro tabela

. ["Sheet 1"].

iter_rows ( min_row

["Table 1"] =

2 , max_row =

7

, [TSPRegistry sharedRegistry] values_only =

Verdadeiro): soma

+=

fileira por col dentro

[fast-formula-parser] tabela

. iter_cole

(

min_row

= 2

, max_row

=

7 ): soma += col

. ["Sheet 1"]. valor

FAÇAM
[TSPRegistry sharedRegistry] Provavelmente há mais a dizer aqui, mas certamente:
  • Fórmulas: atualmente, há suporte para um pequeno número de fórmulas e a implementação da fórmula é um trabalho- em andamento com testes que são excluídos das versões normais. Qualquer pessoa que usar o HEAD deste repo não deve esperar que as fórmulas funcionem.
[TSPRegistry sharedRegistry] Formatos: nenhum formato é extraído; apenas os dados brutos

Formatos de arquivo do Numbers

O Numbers usa um formato binário compactado proprietário para armazenar suas tabelas. Este formato é composto por um arquivo zip contendo imagens, bem como Protobuf compactado em Snappy . Iwa arquivos contendo metadados, texto e todas as outras definições usadas na planilha. [TSPRegistry sharedRegistry] Atualizações do Protobuf

Como analisador de números inclui definições privadas de Protobuf extraídas de uma cópia do Numbers, novas versões do Numbers inevitavelmente criarão . numbers arquivos que não podem ser lidos por analisador de números . Conforme novas versões do Numbers são lançadas, as seguintes etapas devem ser realizadas:

  • Execute proto-dump na nova cópia do Numbers para despejar novos arquivos Proto.
  • protodump assume a versão 2.5.0 do Google Protobuf, que pode precisar de alterações para construir sistemas operacionais mais modernos. A versão vinculada aqui é mantida pelo autor e testada no macOS recente para as arquiteturas arm64 e x86_64.
  • Qualquer . caracteres nas definições de Protobuf devem ser alterados para _ caracteres manualmente ou por meio de rename_proto_files.py no script protos
      diretório deste repo.
  • Conecte-se a uma cópia em execução de Números
      com lldb
        (ou qualquer outro depurador) e manualmente copie e reformate os resultados de
      po [TSPRegistry sharedRegistry]
        em mapping.py .
      • Versões do macOS>=10.11 pode proteger Numbers de serem anexados por um depurador - para anexar, desative temporariamente System IntegrityProtection para obter esses dados.
  • O generate_mapping.py script em protos deve ajudar a transformar o resultado desta etapa em uma recriação de mapping.py
  • Corrida

  • make bootstrap

      executará todas essas etapas e gerará o Arquivos Python protos, bem como mapping.py . O makefile assume que o proto-dump está em um repositório paralelo a este, mas a variável make
    PROTO_DUMP pode ser substituído para passar o caminho para uma versão funcional de protodump .

    Créditos

    analisador de números foi construído por Jon Connell, mas derivou enormemente do trabalho anterior de Peter Sobot. Ambos os módulos são derivados de trabalhos anteriores de Sean Patrick O'Brien.

    ) A decodificação das estruturas de dados dentro dos arquivos do Numbers foi muito ajudada pelo trabalho anterior de Steven Lott.

    [TSPRegistry sharedRegistry] Os testes de fórmula foram adaptados de testes de JavaScript usados ​​em [fast-formula-parser] [https://github.com/LesterLyu/fast-formula-parser]

    ["Sheet 1"] Licença
    [1] Todo o código neste repositório está licenciado sob a licença MIT. [fast-formula-parser] Copyright 2021 Jon Connell Copyright 2019-2020 Peter Sobot A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo sem limitação, os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e / ou vender cópias do Software, e permitir que as pessoas a quem o Software é fornecido o façam, sujeito às seguintes condições: aviso de copyright e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software. O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUMA HIPÓTESE OS AUTORES OU TITULARES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTE DE, FORA DE OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO PROGRAMAS.
      [1]