Python 3.x bsddb3无法读取整个文件

Python 3.x bsddb3无法读取整个文件,python-3.x,bsddb,Python 3.x,Bsddb,我创建Berkeley DB文件的代码: def create_bdb_对象(文件名): bdb=bsddb3.db.db() bdb.set_标志(bsddb3.db.db_DUP | bsddb3.db.db_DUPSORT) open_flags=bsddb3.db.db_CREATE | bsddb3.db.db_不包括 如果os.path.exists(文件名)且为_create: 删除(文件名) open(文件名,dbtype=bsddb3.db.db\u BTREE,flags=o

我创建Berkeley DB文件的代码:

def create_bdb_对象(文件名):
bdb=bsddb3.db.db()
bdb.set_标志(bsddb3.db.db_DUP | bsddb3.db.db_DUPSORT)
open_flags=bsddb3.db.db_CREATE | bsddb3.db.db_不包括
如果os.path.exists(文件名)且为_create:
删除(文件名)
open(文件名,dbtype=bsddb3.db.db\u BTREE,flags=open\u flags)
返回bdb
之后,我在这个文件中写入了一些pickle数据。文件创建时没有任何问题

更新#1: 写入文件的代码:

def write_to_the_file(filename, kv_pair_rdd):
    bdb_filename = f'{filename}.new'
    bdb = create_bdb_object(bdb_filename)

    for url, record in kv_pair_rdd.toLocalIterator():
        bdb.put(url.encode(), pickle.dumps(record, protocol=2))

    bdb.close()
    os.rename(bdb_filename, filename)
但当我试图读取此文件时,并不是从中获取所有数据。 在文件中应该有9条记录,但阅读后我只得到4条

当我执行
db\u dump-p filename
时,我得到9条记录

从文件中读取数据的代码:

bdb=bsddb3.db.db()
bdb.set_标志(bsddb3.db.db_DUP | bsddb3.db.db_DUPSORT)
打开(文件名)
bdb_cursor=bdb.cursor()
record=bdb_cursor.first()
而记录:
打印(记录[0],pickle.load(记录[1]))
record=bdb_cursor.next()
bdb_cursor.close()
bdb.close()

有人能解释一下我做错了什么吗?

调查一下你的文件中有哪些数据。我使用了您的代码并创建了以下脚本:

import bsddb3
import os
import pickle


def create_bdb_object(filename):
    bdb = bsddb3.db.DB()
    bdb.set_flags(bsddb3.db.DB_DUP | bsddb3.db.DB_DUPSORT)
    open_flags = bsddb3.db.DB_CREATE | bsddb3.db.DB_EXCL
    if os.path.exists(filename):
        os.remove(filename)
    bdb.open(filename, dbtype=bsddb3.db.DB_BTREE, flags=open_flags)
    return bdb


def write_to_the_file(filename, data):
    bdb_filename = f'{filename}.new'
    bdb = create_bdb_object(bdb_filename)

    for url, record in data.items():
        bdb.put(url.encode(), pickle.dumps(record, protocol=2))

    bdb.close()
    os.rename(bdb_filename, filename)


def read_bdb(bdb_filename):
    bdb = bsddb3.db.DB()
    bdb.set_flags(bsddb3.db.DB_DUP | bsddb3.db.DB_DUPSORT)
    bdb.open(bdb_filename)
    bdb_cursor = bdb.cursor()

    record = bdb_cursor.first()
    counter = 1
    while record:
        print('Record num: %s, key: %s, value: %s' % (counter, record[0], pickle.loads(record[1])))
        record = bdb_cursor.next()
        counter += 1

    bdb_cursor.close()
    bdb.close()


def main():
    bdb_filename = '/tmp/bsddb.bdb'
    data = {'www.example1.com': 'lorem ipsum 1',
            'www.example2.com': 'lorem ipsum 2',
            'www.example3.com': 'lorem ipsum 3',
            'www.example4.com': 'lorem ipsum 4',
            'www.example5.com': 'lorem ipsum 5',
            'www.example6.com': 'lorem ipsum 6',
            'www.example7.com': 'lorem ipsum 7',
            'www.example8.com': 'lorem ipsum 8',
            'www.example9.com': 'lorem ipsum 9'}
    write_to_the_file(bdb_filename, data)

    read_bdb(bdb_filename)


main()
它工作完美,无法发现问题,以下是输出:

Record num: 1, key: b'www.example1.com', value: lorem ipsum 1
Record num: 2, key: b'www.example2.com', value: lorem ipsum 2
Record num: 3, key: b'www.example3.com', value: lorem ipsum 3
Record num: 4, key: b'www.example4.com', value: lorem ipsum 4
Record num: 5, key: b'www.example5.com', value: lorem ipsum 5
Record num: 6, key: b'www.example6.com', value: lorem ipsum 6
Record num: 7, key: b'www.example7.com', value: lorem ipsum 7
Record num: 8, key: b'www.example8.com', value: lorem ipsum 8
Record num: 9, key: b'www.example9.com', value: lorem ipsum 9

也许,您有一些额外的代码,可以以某种方式修改您的数据

调查您的文件中有哪些数据。我使用了您的代码并创建了以下脚本:

import bsddb3
import os
import pickle


def create_bdb_object(filename):
    bdb = bsddb3.db.DB()
    bdb.set_flags(bsddb3.db.DB_DUP | bsddb3.db.DB_DUPSORT)
    open_flags = bsddb3.db.DB_CREATE | bsddb3.db.DB_EXCL
    if os.path.exists(filename):
        os.remove(filename)
    bdb.open(filename, dbtype=bsddb3.db.DB_BTREE, flags=open_flags)
    return bdb


def write_to_the_file(filename, data):
    bdb_filename = f'{filename}.new'
    bdb = create_bdb_object(bdb_filename)

    for url, record in data.items():
        bdb.put(url.encode(), pickle.dumps(record, protocol=2))

    bdb.close()
    os.rename(bdb_filename, filename)


def read_bdb(bdb_filename):
    bdb = bsddb3.db.DB()
    bdb.set_flags(bsddb3.db.DB_DUP | bsddb3.db.DB_DUPSORT)
    bdb.open(bdb_filename)
    bdb_cursor = bdb.cursor()

    record = bdb_cursor.first()
    counter = 1
    while record:
        print('Record num: %s, key: %s, value: %s' % (counter, record[0], pickle.loads(record[1])))
        record = bdb_cursor.next()
        counter += 1

    bdb_cursor.close()
    bdb.close()


def main():
    bdb_filename = '/tmp/bsddb.bdb'
    data = {'www.example1.com': 'lorem ipsum 1',
            'www.example2.com': 'lorem ipsum 2',
            'www.example3.com': 'lorem ipsum 3',
            'www.example4.com': 'lorem ipsum 4',
            'www.example5.com': 'lorem ipsum 5',
            'www.example6.com': 'lorem ipsum 6',
            'www.example7.com': 'lorem ipsum 7',
            'www.example8.com': 'lorem ipsum 8',
            'www.example9.com': 'lorem ipsum 9'}
    write_to_the_file(bdb_filename, data)

    read_bdb(bdb_filename)


main()
它工作完美,无法发现问题,以下是输出:

Record num: 1, key: b'www.example1.com', value: lorem ipsum 1
Record num: 2, key: b'www.example2.com', value: lorem ipsum 2
Record num: 3, key: b'www.example3.com', value: lorem ipsum 3
Record num: 4, key: b'www.example4.com', value: lorem ipsum 4
Record num: 5, key: b'www.example5.com', value: lorem ipsum 5
Record num: 6, key: b'www.example6.com', value: lorem ipsum 6
Record num: 7, key: b'www.example7.com', value: lorem ipsum 7
Record num: 8, key: b'www.example8.com', value: lorem ipsum 8
Record num: 9, key: b'www.example9.com', value: lorem ipsum 9

也许,您有一些额外的代码可以以某种方式修改您的数据

添加请编写如何将记录写入bdbAdd请编写如何将记录写入bdbSergius,谢谢您的调查。主要原因是我已经通过并阅读了另一个文件。塞吉乌斯,谢谢你的调查。主要原因是我已经通过并读取了另一个文件。