Python2.7搜索包含字符串而不解压缩的.kml的zip文件

时间:2016-06-17 11:37:10

标签: python python-2.7 kml zipfile

我正在尝试编写下面的第一个python脚本。我想在HPC上搜索只读存档,以查看包含在具有各种其他文件夹/文件类型的文件夹中的zip文件。如果zip包含.kml文件,我想在那里打印以字符串<coordinates>开头的行。

import zipfile as z 
kfile = file('*.kml') #####breaks here#####
folderpath = '/neodc/sentinel1a/data/IW/L1_GRD/h/IPF_v2/2015/01/21'  # folder with multiple folders and .zips
for zipfile in folderpath:  # am only interested in the .kml files within the .zips
    if kfile in zipfile:
        with read(kfile) as k:
            for line in k:
                if '<coordinates>' in line:  # only want the coordinate line
                    print line  # print the coordinates
k.close()

最终我想通过多个文件夹循环它,而不是指向确切的文件夹位置,即遍历这里/neodc/sentinel1a/data/IW/L1_GRD/h/IPF_v2/2015/中的每个子文件夹,但这是我尝试理解python如何工作的起点。 / p>

我确信这个脚本在运行之前会遇到很多问题,但我现在的脚本是

kfile = file('*.kml')
IOError: [Errno 22] invalid mode ('r') or filename: '*.kml'
Process finished with exit code 1

为了让这个简单的流程脚本有效,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

当你跑步时:

kfile = file('*.kml')

您正在尝试打开一个名为*.kml的单个文件,这不是您想要的。如果要处理所有*.kml个文件,则需要(a)获取匹配文件列表,然后(b)处理列表中的这些文件。

有很多方法可以实现上述目标;最简单的可能就是glob模块,它可以像这样使用:

import glob
for kfilename in glob.glob('*.kml'):
    print kfilename

但是,如果您尝试处理目录树而不是单个目录,则可能需要调查os.walk函数。来自文档:

  

通过从上到下或从下到上走树来生成目录树中的文件名。对于以目录top(包括top本身)为根的树中的每个目录,它会产生一个3元组(dirpath,dirnames,filenames)。

一个简单的例子可能如下所示:

import os
for root, dirs, files in os.walk('topdir/'):
    kfilenames = [fn for fn in files if fn.endswith('.kml')]
    for kfilename in kfilenames:
        print kfilename

补充评论

迭代字符串

您的脚本有:

for zipfile in folderpath:

这将简单地遍历字符串folderpath中的字符。例如,输出:

folderpath = '/neodc/sentinel1a/data/IW/L1_GRD/h/IPF_v2/2015/01/21'
for zipfile in folderpath:
    print zipefile

将是:

/
n
e
o
d
c
/
s
e
n
t
i
n
e
l
1
a
/

......等等。

读取不是上下文管理器

您的代码有:

with read(kfile) as k:

内置read,文件上的.read方法不能用作上下文管理器。

KML是XML

您正在寻找以<coordinate>&#34;开头的&#34;行,但KML文件不是基于行的。整个KML可以是一行,它仍然有效。

使用XML解析器解析XML会好得多。