我正在尝试编写下面的第一个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
为了让这个简单的流程脚本有效,任何帮助都会受到赞赏。
答案 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
方法不能用作上下文管理器。
您正在寻找以<coordinate>
&#34;开头的&#34;行,但KML文件不是基于行的。整个KML可以是一行,它仍然有效。
使用XML解析器解析XML会好得多。