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。
我正在尝试在下面编写我的第一个 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。