如何将所有数据附加到 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)
主要有两个原因:
当你这样做时:
pathdict['series'] = meta.get('content')
您正在覆盖 pathdict['series']
中的最后一个值,所以我认为这是您应该保存的地方。
您还需要复制它,否则它也会在列表中发生变化。当您存储 dict 时,您实际上是在存储对它的重新引用(在本例中,是对变量 pathdict
.
的引用)
备注
如果你想在单独的行中打印列表的元素,你可以这样做:
print(*save, sep="\n")
我正在尝试创建一个元数据抓取工具来丰富我的 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)
主要有两个原因:
当你这样做时:
pathdict['series'] = meta.get('content')
您正在覆盖
pathdict['series']
中的最后一个值,所以我认为这是您应该保存的地方。您还需要复制它,否则它也会在列表中发生变化。当您存储 dict 时,您实际上是在存储对它的重新引用(在本例中,是对变量
的引用)pathdict
.
备注
如果你想在单独的行中打印列表的元素,你可以这样做:
print(*save, sep="\n")