Python比较XML.Etree和目录列表

时间:2015-11-24 12:03:09

标签: python python-3.x xml.etree

我正在使用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

2 个答案:

答案 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)

鸟瞰:

  1. 从XML创建一个完整路径名的集合(数据类型a = A.query.get(1) c_ids = [c.id for b in a.bs for c in b.cs] !)。
  2. 从本地文件系统创建另一组完整路径名。
  3. 使用set操作来获取任何一方的路径。