Как редактировать файл dbf (из шейп-файла) с python, сохраняя смешанный регистр в именах полей: ограничение пакета dbf? - PullRequest
1 голос
/ 20 апреля 2020

Мне нужно программно переименовать некоторые поля в существующем шейп-файле. Информация хранится в соответствующем файле dbf, поэтому я использовал пакет dbf с кодом ниже (он был упрощен для совместного использования, но он функционален):

import os, dbf

HIGH_LEVEL = 2
LOW_LEVEL = 4
table = dbf.Table('Polygons.dbf')
table.open(mode=dbf.READ_WRITE)
try:
    for oldName in table.field_names:
        suf = int(oldName[-1:])
        if suf == HIGH_LEVEL:
            newName = oldName.upper().replace(str(HIGH_LEVEL), 'high')[:10]
            print(f"{oldName} -> {newName}")
            table.rename_field(oldName, newName)
        if suf == LOW_LEVEL:
            newName = oldName.upper().replace(str(LOW_LEVEL), 'low')[:10]
            print(f"{oldName} -> {newName}")
            table.rename_field(oldName, newName)
finally:
    table.close()

Но в результате все символы в нижнем регистре. Взглянув на пакет dbf, функцию rename_field, все, что он делает, это строчные буквы старого имени и нового имени:

def rename_field(self, oldname, newname):
    """
    renames an existing field
    """
    oldname = oldname.lower()
    newname = newname.lower()
    ...

Вы можете комментировать обе строки (я не рекомендую изменять пакеты но только для тестирования), и тогда вы получите первое переименование, но второе не удастся, потому что первое читается в нижнем регистре пакетом dbf и не может его найти.

С другой стороны, используя QGIS, ручное переименование в смешанном регистре может быть сделано, так что это не ограничение самих файлов dbf, а не ограничение пакета dbf.

Итак, любой может указать мне на модуль python, который позволяет мне переименовывать dbf имена полей со смешанным регистром?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

Имена полей в нижнем регистре только для представления. Они хранятся в файле в верхнем регистре, и вы можете получить к ним доступ в верхнем регистре (начиная с версии 0.98.1).

...