0

xls に変換しようとしている dbfs の山があります。

さまざまな例の私のテスト ファイルではうまくいっていますが、作業中の大きな厄介なファイル (「現実世界」の例) に適用すると、コードは次のように返されます。

    Traceback (most recent call last):
      File "C:\...\final_sum _sw.py", line 73, in <module>
        dbf_xls(z, output_xls) #defined, reads dbf, writes xls
      File "C:\...\final_sum _sw.py", line 18, in dbf_xls
        sheet1.row(row).write(col, DBF[row][col])
      File "C:\Python26\ArcGIS10.0\lib\site-packages\dbfpy\dbf.py", line 242, in __getitem__
        return self.RecordClass.fromStream(self, self._fixIndex(index))
      File "C:\Python26\ArcGIS10.0\lib\site-packages\dbfpy\record.py", line 121, in fromStream
        return cls.fromString(dbf, cls.rawFromStream(dbf, index), index)
      File "C:\Python26\ArcGIS10.0\lib\site-packages\dbfpy\record.py", line 140, in fromString
        [_fd.decodeFromRecord(string) for _fd in dbf.header.fields])
      File "C:\Python26\ArcGIS10.0\lib\site-packages\dbfpy\fields.py", line 173, in decodeFromRecord
        return self.decodeValue(self.rawFromRecord(record))
      File "C:\Python26\ArcGIS10.0\lib\site-packages\dbfpy\fields.py", line 244, in decodeValue
        return int(value)
    ValueError: invalid literal for int() with base 10: '1 U'

表の問題値 = Cumula. 面積は 1.1 不明なマテリアル タイプです。

他のファイルには、同じ「数字、スペース、文字」形式またはエラーを返す同じ問題があります。

dbfpy はこのフィールドを 'c' として読み取りますが、dbfpy がこの値を int() として扱う原因となっている小数やピリオドについて何かありますか? モジュールをだましてすべての値を厳密に文字列値として扱うように強制する方法はありますか?

4

2 に答える 2

0

非ASCII文字(度記号、他の奇妙なものを挿入することに決めたもの)を含む長いテキストフィールド(文字長253-256)の問題を引き起こしたすべてのフィールドであることが判明しました。解決:

import codecs
blah_blah.encode("ascii", "ignore")

エラーを ? などに置き換えた可能性があります。

于 2012-08-08T03:07:32.537 に答える
0

私は使用していませんdbfpy私の dbf モジュールを使ってみましたか? コードは次のようになります。

import dbf
table = dbf.Table(r'\path\to\dbf_file\filename')
table.open()

以降:

for row, record in enumerate(table):
    for col, value in enumerate(record):
        sheet1.row(row).write(col, value)

問題がある場合は、メールでお気軽にお問い合わせください。

于 2012-06-18T22:47:31.163 に答える