Python dbf包:读取带有备忘录数据的文件不起作用

Python dbf包:读取带有备忘录数据的文件不起作用,python,dbf,memo,Python,Dbf,Memo,在Python 3.6.3的Anaconda下,我尝试读取一个dbf文件,其中包含备忘录数据。该文件是从商业软件导出的。 我使用dbf包,版本0.97.11。文件类型为: In [10]: dbf.table_type('C:\\Users\\kmec\\Documents\\Python Scripts\\misc\\test_dbf\\RelLinks.dbf') Out[10]: (131, 'dBase III Plus w/memos') 该文件附带一个dbt文件RelLinks.d

在Python 3.6.3的Anaconda下,我尝试读取一个dbf文件,其中包含备忘录数据。该文件是从商业软件导出的。 我使用dbf包,版本0.97.11。文件类型为:

In [10]: dbf.table_type('C:\\Users\\kmec\\Documents\\Python Scripts\\misc\\test_dbf\\RelLinks.dbf')
Out[10]: (131, 'dBase III Plus w/memos')
该文件附带一个dbt文件RelLinks.dbt(约460MB),与dbf文件位于同一文件夹中。我的理解是(基于),备忘录数据存储在.DBT文件中。因此,我假设以下代码应该可以工作:

d=dbf.Table( 'C:\\Users\\kmec\\Documents\\Python Scripts\\misc\\test_dbf\\RelLinks.dbf', ignore_memos=False, codepage='cp852')
d.open()
rellinks = []
for record in d[:10]:
    print(record)
    rellinks.append([record.id, record.srcyear, record.srcid, record.dstyear, record.dstid])   
d.close()
rl = pd.DataFrame.from_records(rellinks, columns = ['rl_id', 'rl_srcyear', 'rl_srcid', 'rl_dstyear', 'rl_dstid'] )
但是,IPython控制台(在Spyder 3.3.1下)中的“out”提示从未出现,因此我需要关闭控制台。
设置
ignore\u memos=True
时,代码将运行,但数据框中包含备注数据的结果列当然为空。 那么,在这种情况下,有没有一种方法可以读取带有备注数据的dbf文件

编辑:

打印(d)
结果:

表:C:\Users\kmec\Documents\Python Scripts\misc\test\u dbf\RelLinks.dbf

    Type:          dBase III Plus
    Codepage:      ascii (plain ol' ascii)
    Status:        DbfStatus.READ_ONLY
    Last updated:  2020-06-25
    Record count:  131847
    Field count:   14
    Record length: 146
    --Fields--
      0) id N(11,0)
      1) reltype M
      2) subreltype M
      3) srcyear M
      4) srctype M
      5) srcid N(11,0)
      6) srcitemtyp M 
      7) srcitemid N(11,0) 
      8) dstyear M
      9) dsttype M
     10) dstid N(11,0)
     11) dstitemtyp M
     12) dstitemid N(11,0)
     13) mjvazba M 
print(d)
d.open()之前和之后。
仅将状态从CLOSED更改为READ\u(非常期待)

事实证明,代码页不是cp852,而是ascii。
修好这个之后

d=dbf.Table( 'C:\\Users\\kmec\\Documents\\Python Scripts\\misc\\test_dbf\\RelLinks.dbf', ignore_memos=False, codepage='ascii') 
执行

for record in d[:10]:
    print(record)
它会像以前一样冻结,但ctrl+C会强制键盘中断以下输出:

Traceback (most recent call last):

  File "<ipython-input-24-902d684f24ef>", line 3, in <module>
    print(record)

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 3024, in __str__
    result.append("%3d - %-10s: %r" % (seq, field, self[field]))

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 2956, in __getitem__
    return self.__getattr__(item)

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 2923, in __getattr__
    value = self._retrieve_field_value(name)

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 3122, in _retrieve_field_value
    datum = retrieve(record_data, fielddef, self._meta.memo, self._meta.decoder)

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 4058, in retrieve_memo
    data = memo.get_memo(block)

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 3607, in get_memo
    return self._get_memo(block)

  File "C:\Users\kmec\Anaconda3\lib\site-packages\dbf\__init__.py", line 3655, in _get_memo
    newdata = self.meta.mfd.read(self.meta.memo_size)

KeyboardInterrupt  
回溯(最近一次呼叫最后一次):
文件“”,第3行,在
打印(记录)
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\uuuuu init\uuuuuu.py”,第3024行,在__
结果.追加(“%3d-%-10s:%r”%(序号,字段,self[field]))
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\ uuuuu init\uuuuuu.py”,第2956行,在uu getitem中__
返回自我。获取属性(项目)
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\uuuuu init\uuuuuu.py”,第2923行,位于__
值=自身。\检索\字段\值(名称)
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\uuuuuu init\uuuuuuuuu.py”,第3122行,位于“检索”字段值中
数据=检索(记录数据、字段定义、自元备忘录、自元解码器)
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\uuuuu init\uuuuuu.py”,第4058行,在检索备忘录中
数据=备忘录。获取备忘录(块)
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\uuuuu init\uuuuuu.py”,第3607行,在get\u备忘录中
返回自我。获取备忘录(块)
文件“C:\Users\kmec\Anaconda3\lib\site packages\dbf\\uuuuu init\uuuuuu.py”,第3655行,在\u get\u备忘录中
newdata=self.meta.mfd.read(self.meta.memo\u大小)
键盘中断

我在dbf模块中找不到问题。我的猜测是,您要么有内存问题(每个备注字段的数据在300万到400万字节之间),要么硬盘速度慢,或者两者兼而有之。

打印(记录)行是否打印过任何内容?没有打印任何内容。一旦代码被执行,控制台似乎“冻结”。在每行代码之后添加一个
print(x)
命令(因此
print(1)
print(2)
,等等)因此,我们可以准确地看到哪一行失败了。这确实很奇怪——如果那些
dbf
/
dbf
文件出现问题,您有没有可能给我发一份副本,让我看看发生了什么?