Python2.7 在不解压缩的情况下搜索包含字符串的 .kml 压缩文件

Python2.7 search zipfiles for .kml containing string without unzipping

我正在尝试在下面编写我的第一个 python 脚本。我想搜索 HPC 上的只读存档,以查看包含在具有各种其他 folder/file 类型的文件夹中的 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 有效。

我确信这个脚本在它出现之前有很多问题 运行 但我目前的问题是

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

感谢任何帮助让这个简单的流程脚本正常工作。

当你运行:

kfile = file('*.kml')

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

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

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

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

Generate the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (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
/

...等等。

read 不是上下文管理器

您的代码有:

with read(kfile) as k:

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

KML 是 XML

您正在查找 "lines beginning with <coordinate>",但 KML 文件不是基于行的。整个 KML 可以是一行,但它仍然有效。

你最好使用 XML 解析器来解析 XML。