Страница 1 из 2

Изменение кодировки DBF файла

Добавлено: 16 май 2010, 07:09
updates-bot
Обсуждение статьи "Изменение кодировки DBF файла"

http://gis-lab.info/qa/dbf-encode.html

Re: Изменение кодировки DBF файла

Добавлено: 13 июл 2010, 09:50
arzobispo
Кодировка переводится, но токо потом возникает такой трабл (скрин завтра приложу, на работе нет PostgreSQL): выскакивает сообщение о несовместимости новой кодировки UTF-8 с текущей (1251) кодировкой в PostgreSQL, и при этом невозможно просмотреть таблицу через pgAdmin или при подключении к таблице из QGIS.

Re: Изменение кодировки DBF файла

Добавлено: 13 июл 2010, 12:42
texnik_80
Доброго времени суток :)

При попытке конвертирования UTF8->CP1251 возникает ошибка такого рода:
Traceback (most recent call last):
File "dbf-encode.py", line 70, in <module>
f=f.encode(outENC)
File "C:\Python27\lib\encodings\cp1251.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
В частности, на обоих файлах - russia-admin-a и russia-admin-l....

Re: Изменение кодировки DBF файла

Добавлено: 20 июл 2010, 20:58
Максим Дубинин
Попробуйте еще раз, в скрипт добавлена возможность пропускать символы, которых нет в результирующей кодировке. По умолчанию, они заменяются на вопросы. Подробности в обновленной статье.

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 09:32
Boris
Подскажите как правильно ставить этот продукт? У меня на машине только OSGeo. Под ним python запускается, без него - нет. Скачанный инсталятор требует, что бы python был прописан в регистре.
---
Эту проблему я решил скачав вместо инсталятора архив dbfpy-2.2.5.tar.gz и установив его через команду описанную в статье. Проверочная команда выполнилась без ошибок.
Но вопрос как "скрестить" два python'а - устанавливаемый стандартно и в составе OSGeow - осталась. Еще и ArcGIS любит свой python установить... :?

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 11:00
Boris
Подскажите, чт не так? Запускаю:

Код: Выделить всё

...>python C:\OSGeo4W\apps\dbfpy\dbf-encode.py tracks.dbf tracks_.dbf
получаю:
Traceback (most recent call last):
File "C:\OSGeo4W\apps\dbfpy\dbf-encode.py", line 66, in <module>
for rec in inFile:
File "C:\OSGeo4W\apps\Python25\lib\site-packages\dbfpy\dbf.py", line 242, in __getitem__
return self.RecordClass.fromStream(self, self._fixIndex(index))
File "C:\OSGeo4W\apps\Python25\lib\site-packages\dbfpy\record.py", line 121, in fromStream
return cls.fromString(dbf, cls.rawFromStream(dbf, index), index)
File "C:\OSGeo4W\apps\Python25\lib\site-packages\dbfpy\record.py", line 140, in fromString
[_fd.decodeFromRecord(string) for _fd in dbf.header.fields])
File "C:\OSGeo4W\apps\Python25\Lib\site-packages\dbfpy\fields.py", line 173, in decodeFromRecord
return self.decodeValue(self.rawFromRecord(record))
File "C:\OSGeo4W\apps\Python25\Lib\site-packages\dbfpy\fields.py", line 244, in decodeValue
return int(value)
ValueError: invalid literal for int() with base 10: '**********'

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 12:05
Voltron
Boris писал(а):Подскажите как правильно ставить этот продукт? У меня на машине только OSGeo. Под ним python запускается, без него - нет. Скачанный инсталятор требует, что бы python был прописан в регистре.
Проблема (если это проблема) известная. Дело в том, что OSGeo4W старается минимально вмешиваться в работу системы, поэтому и не прописывает свой Python в качестве системного
Boris писал(а):Но вопрос как "скрестить" два python'а - устанавливаемый стандартно и в составе OSGeow - осталась. Еще и ArcGIS любит свой python установить... :?
Полного «скрещивания» врядли можно добиться. Но кое-что в этом направлении делается. Вопрос несколько раз поднимался в списках рассылки:
Installing additional packages for python in OSGeo4W (есть пример параллельной установки Python из OSGeo4W и ArcGIS)
Python on the registry (регистрация Python из состава OSGeo4W в реестре)
Есть тикет #114.
Возможно, что-то из этого поможет.

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 12:34
Boris
спасибо. сейчас попробую зарегистрировать.

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 12:41
Boris
Voltron писал(а): Проблема (если это проблема) известная. Дело в том, что OSGeo4W старается минимально вмешиваться в работу системы, поэтому и не прописывает свой Python в качестве системного
Не вмешиваться - это прекрасно. Но свою ОС она ведь при этом не устанавливает, почему бы и Python уже существующий не использовать.

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 12:58
Mavka
Это обычное дело в Windows, в OpenOffice тоже свой python используется.
И программы очень часто привязаны к конкретной версии питона.

Re: Изменение кодировки DBF файла

Добавлено: 04 авг 2011, 13:46
Voltron
Boris писал(а):Не вмешиваться - это прекрасно. Но свою ОС она ведь при этом не устанавливает, почему бы и Python уже существующий не использовать.
Все очень просто. Многие вещи зависят от версии Python, поэтому проще носить свою версию одного пакета, чем 100500 версий остальных под все мыслимые варианты Python.

Re: Изменение кодировки DBF файла

Добавлено: 18 апр 2012, 16:26
Nadia
А возможно скодировать файл dbf из кодировки dos (cp866) в utf8 этим скриптом?

Re: Изменение кодировки DBF файла

Добавлено: 18 апр 2012, 16:53
Voltron
Да

Re: Изменение кодировки DBF файла

Добавлено: 12 сен 2013, 21:44
psyhosis
только char записи обрежутся, длину поля то никто не скорректировал

Ошибка при запуске

Добавлено: 26 ноя 2014, 13:18
vitte
Добрый день. При запуске выдает следующую ошибку. Подскажите в чем дело.

C:\convert>python dbf-encode.py -f CP1251 -t UTF8 sqlexport_linestring.dbf sqlex
port_linestring2.dbf
Traceback (most recent call last):
File "dbf-encode.py", line 66, in <module>
for rec in inFile:
File "C:\Python26\lib\site-packages\dbfpy\dbf.py", line 261, in __getitem__
return self.RecordClass.fromStream(self, self._fixIndex(index))
File "C:\Python26\lib\site-packages\dbfpy\record.py", line 121, in fromStream
return cls.fromString(dbf, cls.rawFromStream(dbf, index), index)
File "C:\Python26\lib\site-packages\dbfpy\record.py", line 140, in fromString
[_fd.decodeFromRecord(string) for _fd in dbf.header.fields])
File "C:\Python26\lib\site-packages\dbfpy\fields.py", line 178, in decodeFromR
ecord
return self.decodeValue(self.rawFromRecord(record))
File "C:\Python26\lib\site-packages\dbfpy\fields.py", line 249, in decodeValue

return int(value)
ValueError: invalid literal for int() with base 10: '**********'