0

我有一堆 dbfs,我正试图将它们转换成 xls。

在我的各种示例的测试文件中,一切都很好,但是当应用于工作中的大讨厌文件(带有“真实世界”示例)时,我的代码返回:

    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

我没用过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 回答
0

事实证明,所有给我带来问题的字段都包含非 ascii 字符(度数符号,人们决定花时间插入的其他奇怪的东西)的长文本字段(字符长度 253-256)。解决方案:

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

我可能已经用 ?'s 或类似的东西替换了错误。

于 2012-08-08T03:07:32.537 回答