0

我正在使用 Python 将我的 flickr 照片与本地硬盘照片目录进行比较。

为了做到这一点,我在 Python 中使用 OAuth 并获取我在 flickr 中拥有的每个文件夹/专辑的 etree 列表。flickr 上的文件夹/专辑内容“应该”与我的本地副本目录匹配。

当我的本地驱动器和 flickr 上的照片列表中没有项目时,我希望我的脚本告诉我(反之亦然)。

flickr 照片的“标题”字段应与 Linux 上的文件名相同,Linux 上的目录名称将/应该与 flickr 上的相册名称匹配。这就是我目前的设置方式。

我想知道在 Python 中比较这些项目列表(etree 节点项目与os.listdir()项目)的最佳和最有效的方法是什么?

除非必要,否则我宁愿不使用sort()bash 将任何管道输出排序为文件名。如果可能的话,我想把所有东西都保存在 Python 中,因为我只是在学习它。

我可以使用os.listdir()它并将其与XML.Etree返回到 flickr 的节点进行比较,但是进行这种比较的最佳方法是什么?

请记住,在比较来自 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

4

2 回答 2

1

要检查您的 flickr 中的文件是否存在于您的高清中:

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文档
is in-Python3文档is(第 6.10.2 节)(以及和== 此处的区别)

于 2015-11-24T13:44:00.977 回答
0

鸟瞰图:

  1. 从 XML创建一组(数据类型set!)完整路径名。
  2. 从本地文件系统创建另一组完整路径名。
  3. 使用set操作来获取两边缺失的路径。
于 2015-11-24T15:38:12.927 回答