如何使用python手术室步行,但首先获取子文件夹,然后获取XML-fi格式的文件

2024-03-29 09:04:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python初学者,开始编写下面的脚本。它已经起作用了,但方式不对。现在我被卡住了,我需要一些帮助。我使用手术室步行以便在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()

我的脚本结果:

^{pr2}$

需要的结果:

<?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>

Tags: pathtextinfalselentitletypedescription
2条回答

我不认为有什么简单的方法可以做你想做的。至少,如果您是手工编写XML的话,就不会有。在

原因是您需要从根目录开始构建XML文档,从最外面的目录开始,生成最顶端的<FileGroup>标记。另一方面,您希望在写出每个文件夹中的文件之前深入到子文件夹中,这样叶目录中的文件将首先出现,根目录中的文件将最后出现。这两个目标相互矛盾。在

我认为有两种策略可以用来解决这个问题。在

第一种方法是使用更复杂的方法来编写XML文件。例如,如果使用允许动态创建文档元素的库,而不是仅使用字符串操作,则可以在文件信息上方插入子文件夹信息,即使按照现在相同的顺序处理它们(先处理文件)。我对Python的XML库不是很了解,所以我在这里没有任何具体的建议,但可能开始的地方是关于标准库中^{}包的文档(您可能只想要一个像xml.etree.Etree这样的子模块,但我不确定这是否最适合您的任务,所以请查看该包并阅读其中任何一个零件看起来合适)。在

另一个选择是改变获取数据的方式。{cd5>如果你想让某个更高级别的文件返回,那么你应该先把它放回更高的级别。关于这一点的棘手之处在于,您需要先构建更高级别的<FileGroup>标记,然后才能开始处理它们所在的文件夹。你需要根据文件夹的路径推断出你所处的深度,但是你已经做了一些这方面的工作,所以可能不会太复杂。(顺便说一句,您确实应该使用os.path模块中的函数来进行文件路径操作,而不是像my_path.split("\\")那样做。)

在Blcknght的评论之后,我删除了“\\”和操作系统特有的东西。这个脚本现在可以在windows和linux上运行了,而且效果很好。我在主脚本上重新开始了。我没有使用xml包,但是为此我创建了两个函数,它们使用操作系统列表目录()而不是手术室步行. 下面是脚本。在

如果你读了你注意到的主要部分的脚本有很多“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()

相关问题 更多 >