如何将所有数据附加到 dict 而不是仅附加最后一个结果?

How to append all data to dict instead of last result only?

我正在尝试创建一个元数据抓取工具来丰富我的 e-book collection,但我遇到了一些问题。我想创建一个 dict (或任何完成工作的东西)来存储索引(仅在测试时)、路径和系列名称。这是我到目前为止编写的代码:

from bs4 import BeautifulSoup 
def get_opf_path():
    
    opffile=variables.items
    pathdict={'index':[],'path':[],'series':[]}
    safe=[]
    x=0
    for f in opffile:
        x+=1
        pathdict['path']=f
        pathdict['index']=x
        with open(f, 'r') as fi:
            soup=BeautifulSoup(fi, 'lxml')
            for meta in soup.find_all('meta'):
                if meta.get('name')=='calibre:series':
                    pathdict['series']=meta.get('content')
                    safe.append(pathdict)        
        print(pathdict)
        
    print(safe)

此代码能够遍历所有 opf 文件并获取系列、索引和路径,我确信这一点,因为控制台输出是这样的:

但是,当我尝试将 pathdict 存储到 safe 时,无论我将 safe.append(pathdict) 放在哪里,输出都是: 或者 或者

我需要做什么才能使 safe=[] 具有 image 1 中显示的数据? 我已经尝试了我能想到的一切,但没有任何效果。

感谢任何帮助。

我认为这是正确的方法:

from bs4 import BeautifulSoup 

def get_opf_path():
    opffile = variables.items
    pathdict = {'index':[], 'path':[], 'series':[]}
    safe = []
    x = 0
    for f in opffile:
        x += 1
        pathdict['path'] = f
        pathdict['index'] = x
        with open(f, 'r') as fi:
            soup = BeautifulSoup(fi, 'lxml')
            for meta in soup.find_all('meta'):
                if meta.get('name') == 'calibre:series':
                    pathdict['series'] = meta.get('content')        
                    print(pathdict)
                    safe.append(pathdict.copy())
    print(safe)

主要有两个原因:

  1. 当你这样做时:

    pathdict['series'] = meta.get('content')
    

    您正在覆盖 pathdict['series'] 中的最后一个值,所以我认为这是您应该保存的地方。

  2. 您还需要复制它,否则它也会在列表中发生变化。当您存储 dict 时,您实际上是在存储对它的重新引用(在本例中,是对变量 pathdict.

    的引用)

备注

如果你想在单独的行中打印列表的元素,你可以这样做:

print(*save, sep="\n")