[英]How to use python os.walk, but first get the subfolders and then the files as XML file
我是python初学者,并开始在以下脚本上工作。 它已经有效,但是方式错误。 现在我被卡住了,我想要一些帮助。 我使用os.walk来获取索引,作为Windows中文件路径的XML文件。 我还添加了脚本的当前结果以及我需要了解的内容。
结果和我需要的结果之间的区别是,子文件夹位于文件之前。
##This Script creates an Index as XML file of a filepath in Windows
import os
#variable
CrawlingStartpoint = r"D:\DATA\WorldDem"
XMLfile = r"xml_index.xml"
XMLLocation = r"D:\DATA\\"
XMLFileLocation = XMLLocation + XMLfile
text = ""
#Standard Starting text for the XML file
text += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ShoeBox>\n<Version>2011</Version>\n<FileGroup>\n<Title>ShoeBox: "
text += XMLfile + "</Title>\n<Description>" + CrawlingStartpoint + "</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
#Scan all folders, subfolders and files. It writes foldernames, subfolder names and files.
#It write a closegroup for every subfolder to build the filestructure in a XML file.
startdept = CrawlingStartpoint.split('\\')
startdept = len(startdept) - 1
old = startdept - 1
for root, dirs, files in os.walk(CrawlingStartpoint, topdown=True):
path = root.split('\\')
if (len(path) - 1) < old:
text += (((old - (len(path) - 1))+1)*'</FileGroup>\n')
old = (len(path) -1)
elif (len(path) - 1) == old:
text += "</FileGroup>\n"
if os.path.join(root) <> CrawlingStartpoint:
text += "<FileGroup>\n<Title>" + os.path.basename(root) + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
for filename in files:
if filename.endswith(".img") or filename.endswith(".jp2") or filename.endswith(".tif"):
text += "<File>\n<Path>" + os.path.join(root, filename) + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
elif filename.endswith(".shp") or filename.endswith(".dxf"):
text += "<File>\n<Path>" + os.path.join(root, filename) + "</Path>\n<Type>vector</Type>\n<Description></Description>\n</File>\n"
if (len(path) - 1) > old:
old = old + 1
text += (((len(path) -1) - startdept)*'</FileGroup>\n')
#Standard Closing text for the XML file
text += "</FileGroup>" + "\n" + "</ShoeBox>"
#Write the filelocations stored in text in the textfile
myfile = open(XMLFileLocation,'a')
myfile.write(text)
myfile.close()
<?xml version="1.0" encoding="UTF-8"?>
<ShoeBox>
<Version>2011</Version>
<FileGroup>
<Title>ShoeBox: xml_index.xml</Title>
<Description>D:\DATA\WorldDem</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
<FileGroup>
<Title>srtm_geotiff_download</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
<File>
<Path>D:\DATA\WorldDem\srtm_geotiff_download\srtm1_90m_v41.img</Path>
<Type>raster</Type>
<Description></Description>
</File>
</FileGroup>
<FileGroup>
<Title>viewfinderpanoramas</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
<File>
<Path>D:\DATA\WorldDem\viewfinderpanoramas\mosaic_vfp_90m_bewerkt_20140211.img</Path>
<Type>raster</Type>
<Description></Description>
</File>
<FileGroup>
<Title>Compressed</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
</FileGroup>
<FileGroup>
<Title>Modellen</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
</FileGroup>
</FileGroup>
</FileGroup>
</ShoeBox>
<?xml version="1.0" encoding="UTF-8"?>
<ShoeBox>
<Version>2011</Version>
<FileGroup>
<Title>ShoeBox: xml_index.xml</Title>
<Description>D:\DATA\WorldDem</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
<FileGroup>
<Title>srtm_geotiff_download</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
<File>
<Path>D:\DATA\WorldDem\srtm_geotiff_download\srtm1_90m_v41.img</Path>
<Type>raster</Type>
<Description></Description>
</File>
</FileGroup>
<FileGroup>
<Title>viewfinderpanoramas</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
<FileGroup>
<Title>Compressed</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
</FileGroup>
<FileGroup>
<Title>Modellen</Title>
<Description>noop</Description>
<Expanded>false</Expanded>
<AddOutputs>false</AddOutputs>
</FileGroup>
<File>
<Path>D:\DATA\WorldDem\viewfinderpanoramas\mosaic_vfp_90m_bewerkt_20140211.img</Path>
<Type>raster</Type>
<Description></Description>
</File>
</FileGroup>
</FileGroup>
</ShoeBox>
我认为没有任何简单的方法可以完成您想要的事情。 至少,如果您是手工编写XML,则没有。
原因是您需要从最上层开始,从最外面的目录开始,生成最顶层的<FileGroup>
标记,来构建XML文档。 另一方面,在从每个文件夹写出文件之前,您要先进入子文件夹,以便叶目录中的文件首先出现,而根目录中的文件最后出现。 这两个目标相互矛盾。
我认为您可以采用两种策略来解决问题。
第一种是使用更复杂的方法来编写XML文件。 例如,如果您使用一个库来动态创建文档的元素,而不仅仅是使用字符串操作,则即使将子文件夹信息在同一文件中进行处理,也可以在文件信息上方插入子文件夹信息。立即订购(先归档)。 我不太了解Python的XML库,因此这里没有任何具体建议,但是可能的出发点是标准库中xml
包上的文档(您可能只需要xml.etree.Etree
类的子模块xml.etree.Etree
,但是我不确定这是否是最适合您的任务的代码,因此请检查包装并阅读看起来合适的任何部分。
另一个选择是改变获取数据的方式。 如果将topdown=True
参数放到os.walk
,它将首先从一些更深的文件夹开始,然后再返回到更高级别的文件夹,这正是您要显示其文件的顺序。 棘手的是,您需要先构建更高级别的<FileGroup>
标记,然后才能处理它们所在的文件夹。 您需要根据文件夹的路径推断出深度,但是您已经在做一些这样的事情,因此它可能不会太复杂。 (顺便说一句,您确实应该使用os.path
模块中的函数来进行文件路径操作,而不是执行诸如my_path.split("\\\\")
。)
在Blcknght评论之后,我删除了“ \\\\”和os特定的东西。 该脚本现在可以在Windows和Linux上运行,效果很好。 我完全从头开始。 我没有使用xml包,但是为此,我创建了2个函数,它们使用os.listdir()而不是os.walk。 在下面找到脚本。
如果您阅读了脚本的主要部分,就会发现有很多“ for”循环和“ if”语句。 对于每个子文件夹,脚本再次进行相同的替换。 但是我不知道如何将其放入“ for”循环。
我可以找出给定搜索文件夹中有多少个子文件夹。 但是我需要一些有关如何为主脚本创建循环的帮助。 我可以在这里使用一些帮助:)
##This Script creates an Index as XML file of a filepath
import os
#variable
CrawlingStartpoint = "D:\DATA\WorldDEM"
XMLfile = r"python.xml"
XMLLocation = r"D:\DATA"
XMLFileLocation = XMLLocation + os.path.sep + XMLfile
text = ""
#Standard Starting text for the XML file
text += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ShoeBox>\n<Version>2011</Version>\n<FileGroup>\n<Title>XMLBox: "
text += XMLfile + "</Title>\n<Description>" + CrawlingStartpoint + "</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
#function with a directory as input, give back all subdirectories in a list
def getdirs(startingdir):
folderlist = list()
folders = os.listdir(startingdir)
for folder in folders:
if os.path.isdir(os.path.join(startingdir, folder)) == True:
folderlist.append(os.path.join(startingdir, folder))
return folderlist
#function with a directory as input, give back all files that ends with img,jp2,tif,shp and dxf in a list
def getfiles(startingdir):
filelist = list()
bestanden = os.listdir(startingdir)
for bestand in bestanden:
if os.path.isfile(os.path.join(startingdir, bestand)) == True:
if bestand.endswith(".img") or bestand.endswith(".jp2") or bestand.endswith(".tif"):
filelist.append(os.path.join(startingdir, bestand))
return filelist
#Scans all files and subfolders. Scans up to the 13th subfolder.
text += "<FileGroup>\n<Title>" + CrawlingStartpoint + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(CrawlingStartpoint):
for dir0 in getdirs(CrawlingStartpoint):
text += "<FileGroup>\n<Title>" + dir0 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir0):
for dir1 in getdirs(dir0):
text += "<FileGroup>\n<Title>" + dir1 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir1):
for dir2 in getdirs(dir1):
text += "<FileGroup>\n<Title>" + dir2 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir2):
for dir3 in getdirs(dir2):
text += "<FileGroup>\n<Title>" + dir3 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir3):
for dir4 in getdirs(dir3):
text += "<FileGroup>\n<Title>" + dir4 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir4):
for dir5 in getdirs(dir4):
text += "<FileGroup>\n<Title>" + dir5 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir5):
for dir6 in getdirs(dir5):
text += "<FileGroup>\n<Title>" + dir6 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir6):
for dir7 in getdirs(dir6):
text += "<FileGroup>\n<Title>" + dir7 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir7):
for dir8 in getdirs(dir7):
text += "<FileGroup>\n<Title>" + dir8 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir8):
for dir9 in getdirs(dir8):
text += "<FileGroup>\n<Title>" + dir9 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir9):
for dir10 in getdirs(dir9):
text += "<FileGroup>\n<Title>" + dir10 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir10):
for dir11 in getdirs(dir10):
text += "<FileGroup>\n<Title>" + dir11 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir11):
for dir12 in getdirs(dir11):
text += "<FileGroup>\n<Title>" + dir12 + "</Title>\n<Description>noop</Description>\n<Expanded>false</Expanded>\n<AddOutputs>false</AddOutputs>\n"
if getdirs(dir12):
for dir13 in getdirs(dir12):
text += "--Error to much subfolders--" + dir13 + "\n"
if getdirs(dir13):
for dir14 in getdirs(dir13):
text += "--Error to much subfolders--" + dir14 + "\n"
if getfiles(dir13):
for files13 in getfiles(dir13):
text += "<File>\n<Path>" + files13 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir12):
for files12 in getfiles(dir12):
text += "<File>\n<Path>" + files12 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir11):
for files11 in getfiles(dir11):
text += "<File>\n<Path>" + files11 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir10):
for files10 in getfiles(dir10):
text += "<File>\n<Path>" + files10 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir9):
for files9 in getfiles(dir9):
text += "<File>\n<Path>" + files9 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir8):
for files8 in getfiles(dir8):
text += "<File>\n<Path>" + files8 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir7):
for files7 in getfiles(dir7):
text += "<File>\n<Path>" + files7 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir6):
for files6 in getfiles(dir6):
text += "<File>\n<Path>" + files6 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir5):
for files5 in getfiles(dir5):
text += "<File>\n<Path>" + files5 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir4):
for files4 in getfiles(dir4):
text += "<File>\n<Path>" + files4 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir3):
for files3 in getfiles(dir3):
text += "<File>\n<Path>" + files3 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir2):
for files2 in getfiles(dir2):
text += "<File>\n<Path>" + files2 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir1):
for files1 in getfiles(dir1):
text += "<File>\n<Path>" + files1 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(dir0):
for files0 in getfiles(dir0):
text += "<File>\n<Path>" + files0 + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
if getfiles(CrawlingStartpoint):
for filesCrawlingStartpoint in getfiles(CrawlingStartpoint):
text += "<File>\n<Path>" + filesCrawlingStartpoint + "</Path>\n<Type>raster</Type>\n<Description></Description>\n</File>\n"
text += "</FileGroup>\n"
#Standard Closing text for the XML file
text += "</FileGroup>\n</XMLBox>"
print text
#Write the filelocations stored in text in the textfile
myfile = open(XMLFileLocation,'a')
myfile.write(text)
myfile.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.