Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert "\x00...\x00" strings to None #43

Open
turicas opened this issue Nov 7, 2023 · 0 comments
Open

Convert "\x00...\x00" strings to None #43

turicas opened this issue Nov 7, 2023 · 0 comments

Comments

@turicas
Copy link

turicas commented Nov 7, 2023

I found str values filled with \x00...\x00 in some DBFs, which I suppose should be converted to None (I don't know the DBF specs, I'm just supposing since the data source where I downloaded the file from also shared a CSV version and these values are NULL in the CSV).

The code to reproduce is below. I could not upload the DBF file here, but you can download it from my website.

from pprint import pprint

import dbf

dbf_filename = "vw_infracao_poligono_publico.dbf"
encoding = "utf8"
table = dbf.Table(dbf_filename, codepage=encoding, on_disk=True)
field_names = table.field_names
table.open()
for record in table:
    row = {field_name: record[field_name] for field_name in field_names}
    if row["CODIGOSOLI"].strip() == "autoinfracaosga_URX8ECKUFY6305":
        pprint(row)

The result is (check the value for NUMERO_AUT):

{'CODIGOSOLI': 'autoinfracaosga_URX8ECKUFY6305                                                                                                                                                                                                                                ',
 'DATA_AUTUA': datetime.datetime(2017, 5, 8, 3, 0),
 'DESCRICAO': 'Por desmatar a corte raso área total de 4,3ha de vegetação '
              'nativa em RL sem autorização do órgão '
              'competente.                                                                                                                                           ',
 'DT_ABERTUR': datetime.datetime(2017, 5, 15, 16, 32, 28, 943000),
 'MOTIVO_AUT': 'Desmatamento.                                                                                                                                                                                                                                                 ',
 'NUMERO_AUT': '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 'NUMERO_SEI': '202000017012601                                                                                                                                                                                                                                               '}

I've tested some solutions and the fastest one is this:

for record in table:
    row = {}
    for field_name in field_names:
        value = record[field_name]
        if isinstance(value, str) and value and value[0] == value[-1] == "\x00" and set(value) == {"\x00"}:
            value = None
        row[field_name] = value
    if row["CODIGOSOLI"].strip() == "autoinfracaosga_URX8ECKUFY6305":
        pprint(row)

... and the result:

{'CODIGOSOLI': 'autoinfracaosga_URX8ECKUFY6305                                                                                                                                                                                                                                ',
 'DATA_AUTUA': datetime.datetime(2017, 5, 8, 3, 0),
 'DESCRICAO': 'Por desmatar a corte raso área total de 4,3ha de vegetação '
              'nativa em RL sem autorização do órgão '
              'competente.                                                                                                                                           ',
 'DT_ABERTUR': datetime.datetime(2017, 5, 15, 16, 32, 28, 943000),
 'MOTIVO_AUT': 'Desmatamento.                                                                                                                                                                                                                                                 ',
 'NUMERO_AUT': None,
 'NUMERO_SEI': '202000017012601                                                                                                                                                                                                                                               '}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant