2015-10-25 6 views
1

Этот сценарий отлично выглядит в средстве просмотра dbf, но OpenOffice Calc по умолчанию использует набор символов Западной Европы (DOS/OS2-850 International). При открытии символы, отличные от ASCII, неверны. Когда используется набор символов Западной Европы (Windows-1252/WinLatin 1), он выглядит отлично. MS Access 2000 интерпретирует как DOS 850. У меня отсутствует параметр или параметр где-нибудь?Рабочий сценарий python делает dbf, который интерпретируется как cp850 вместо cp1252 с помощью OpenOffice Calc

import sys, os.path, string 
import dbf as dbfpp 
print 'stdin:', sys.stdin.encoding, 'stdout:', sys.stdout.encoding # cp437 both if run in win cmd.exe, None, utf-8 in pywin 

def main(): 
    flddef = 'SITE_CODE N(19,6);HW_CODE C(13);PROGRAM C(10);SITE_NAME C(85);START_DATE D;DESCRIPT M;ACRES N(19,6);' 
    dbffile = 'X:/Import/ny/esrd/esrd2015test_ny/outdbf/test.dbf' 
    if os.path.isfile(dbffile): 
     os.remove(dbffile) 
    dbfmake = dbfpp.Table(
     dbffile, 
     flddef, 
     codepage='cp1252', 
     on_disk=True, 
     ) 
    dbfmake.open() 
    print dbfmake.codepage # cp1252 (Windows ANSI) 
    descvalinit = 'The site was on Cayuga Lake ¼ mile from shore (these non-gremlins): µ©®æ§. A gremlin phrase:“only perch”.' 
    print 'descvalinit in list:', [descvalinit] # ['The site was on Cayuga Lake \xbc mile from shore (these non-gremlins): \xb5\xa9\xae\xe6\xa7. A gremlin phrase:\x93only perch\x94.'] 
    descval = unicode(descvalinit, '1252') 
    print 'descval in list:', [descval] # [u'The site was on Cayuga Lake \xbc mile from shore (these non-gremlins): \xb5\xa9\xae\xe6\xa7. A gremlin phrase:\u201conly perch\u201d.'] 
    datum = (33567.000000, '100000B ', 'HW', 'Fishing spot', None, descval, 18) 
    print 'datum:', datum # (33567.0, '100000B ', 'HW', 'Fishing spot', None, u'The site was on Cayuga Lake \xbc mile from shore (these non-gremlins): \xb5\xa9\xae\xe6\xa7. A gremlin phrase:\u201conly perch\u201d.', 18) 
    dbfmake.append(datum) 
    dbfmake.close() 

if __name__ == "__main__": 
    main() 

Использование Python 2.7.3 32 бит на Windows 7 x64

ответ

0

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

Однако according to this answer в GIS есть некоторые программы, которые выглядят в отдельном .cpg или .cst файл, чтобы получить кодировку.

Я нашел (но не могу переделать) сообщение в форуме от 2008 года, обсуждая ошибку Calc, чтобы правильно декодировать dbf.

Итак, в этот момент я попытался создать файл test.cpg с одной строкой cp1252 и посмотреть, работает ли это (и попробуйте test.cst, если это не так).

+0

Ни один из файлов не изменил поведение для Calc или Access. BTW Я упомянул Calc, потому что я думал, что он продемонстрировал проблему с кодировкой. Мне очень важно получить данные в MS Access. –

+0

Возможно, вы захотите конвертировать в csv и импортировать это; проверьте [мой ответ здесь] (http://stackoverflow.com/a/32772924/208880). –

+0

Данные начинаются как csv, слегка редактируются программно и загружаются в таблицу postgres, поэтому я мог бы, вероятно, получить ее в Access оттуда. Был надежен иметь один dbf, который могла бы прочитать устаревшая программа ГИС и Access. –