我正在使用Python将我的flickr照片与我当地的硬盘照片目录进行比较。
为了做到这一点,我在Python中使用OAuth并获取我在flickr中的每个文件夹/相册的列表。 flickr上的文件夹/专辑内容'应该'匹配我的本地拷贝目录。
我希望我的脚本告诉我当我的本地驱动器和flickr上的照片列表中没有项目时(反之亦然)。
flickr照片的“标题”字段应与Linux上的文件名相同,Linux上的目录名将与/应匹配flickr上的相册名称。这就是我目前的设置方式。
我想知道在Python(etree节点项目与os.listdir()
项目)中比较这些项目列表的最佳和最有效的方法是什么?
除非必要,否则我宁愿不在bash中使用sort()
来将任何管道输出排序为文件名。我想尽可能保留Python中的所有内容,因为我正在学习它。
我可以使用os.listdir()
并将其与返回到flickr的XML.Etree
节点进行比较,但进行此比较的最佳方法是什么?
请记住,列表可能不一样,在比较flickr和Linux中的项目时可能无法排序。
我编写了以下代码片段来获取flickr的结果:
...oauth code above...
sets = flickr.photosets.getList(user_id=user_id)
print ("Total sets: " + sets.find('photosets').attrib['total'])
all_sets = sets.find('photosets').findall('photoset')
for each_set in all_sets:
for node in each_set.findall('title'):
print ("photoset: " + each_set.get('id') + ", " + node.text + ", photos: ", each_set.get('photos'))
all_photos = flickr.photosets.getPhotos(user_id=user_id, photoset_id=each_set.get('id'))
photos = all_photos.find('photoset')
for photo in photos:
print (photo.get('title'))
上述代码的输出示例如下:
photoset: 72157659163323894, Birthday Party - Nov 21, 2015, photos: 131
...
2015:11:21-16:11:14-IMG_20151121_161114372
2015:11:21-16:11:10-IMG_20151121_161109739
2015:11:21-16:10:36-IMG_20151121_161035497
2015:11:21-15:47:14-IMG_20151121_154713671
2015:11:21-15:43:17-IMG_20151121_154317180
2015:11:21-15:43:15-IMG_20151121_154315539
2015:11:21-15:23:42-IMG_20151121_152342348
2015:11:21-15:23:11-IMG_20151121_152311411
...
2015:11:21-16:21:19-DSC_0603
2015:11:21-16:21:13-DSC_0602
2015:11:21-16:21:11-DSC_0601
2015:11:21-16:21:09-DSC_0600
2015:11:21-16:21:07-DSC_0599
2015:11:21-16:21:05-DSC_0598
2015:11:21-16:20:13-DSC_0597
2015:11:21-16:20:09-DSC_0596
2015:11:21-16:19:59-DSC_0595
2015:11:21-16:19:56-DSC_0594
2015:11:21-16:19:55-DSC_0593
...
getPhotos的API在这里:https://www.flickr.com/services/api/flickr.photosets.getPhotos.htm,它显示了一些示例xtree / XML输出。
Etree API:https://docs.python.org/2/library/xml.etree.elementtree.html
答案 0 :(得分:1)
检查你的flick上的文件是否存在于你的hd:
not_on_hd = []
for file in flickr_photos:
if os.path.exists("path/to/"+file):
continue
else:
not_on_hd.append(file)
print(not_on_hd)
要做到这一点,我会使用一个简单的if file_on_drive is in flickr_photos
,并将返回false的那些附加到列表中,就像上面一样。
not_on_flickr = []
for file_on_drive in files_on_drive:
if file_on_drive in flickr_photos:
continue
else:
not_on_flickr.append(file_on_drive)
print(not_on_flickr)
因为你要求效率:pop()从列表中第一次运行中找到的任何文件,使第二次运行更短。
not_on_hd = []
for i,file in enumerate(flickr_photos):
if os.path.exists("/path/to/"+file):
continue
else:
not_on_hd.append(file)
flickr_photos.pop(i)
print(not_on_hd)
以下是我在那里所做的一些文档:
enumerate()
- python3 docs
is in
- Python3 Docs(第6.10.2节)(以及is
和==
here之间的差异)
答案 1 :(得分:0)
鸟瞰:
a = A.query.get(1)
c_ids = [c.id for b in a.bs for c in b.cs]
!)。set
操作来获取任何一方的路径。