繁体   English   中英

如何使用python os.walk,但首先获取子文件夹,然后将文件转换为XML文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM