Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用文件内容中的节点名称从fs创建嵌套字典?_Python_Algorithm_File_Recursion - Fatal编程技术网

Python 如何使用文件内容中的节点名称从fs创建嵌套字典?

Python 如何使用文件内容中的节点名称从fs创建嵌套字典?,python,algorithm,file,recursion,Python,Algorithm,File,Recursion,我需要进入目录并查看-是否有扩展名为.txt的文件,如果有-提取此文件的内容并用此内容替换当前目录的名称。之后,向前移动到子目录并执行相同的操作 例如: 输入时: directory --name.txt --subdir ----name.txt --subdir2 ----name.txt ----subdir3 -------name.txt 论产出 {'name': 'directory/name.txt', 'content': 'Name 1', 'descendent':

我需要进入目录并查看-是否有扩展名为.txt的文件,如果有-提取此文件的内容并用此内容替换当前目录的名称。之后,向前移动到子目录并执行相同的操作

例如:

输入时:

directory
--name.txt
--subdir
----name.txt
--subdir2
----name.txt
----subdir3
-------name.txt
论产出

{'name': 'directory/name.txt', 
'content': 'Name 1', 'descendent': 
       [{'name': 'directory/subdir/name.txt', 
       'content': 'Name 2', 
       'descendent': None}, 
        {'name': 'directory/subdir2/name.txt', 
         'content': 'Name 3', 
         'descendent': 
                [{'name': 'directory/subdir2/subdir3/name.txt', 
                'content': 'Name 4', 
                'descendent': None}]}]}
我写了一个简单的实现,但有点不对劲:

__author__ = 'ivanov'

import sys
import os
from os.path import isfile
import json

def readFile(filename):
    f = open(filename, 'r')
    res = f.read()
    f.close()
    return res

try:
    myname = sys.argv[1]
except Exception, e:
    print "usage : python [listfile.py] [foldername]"
    exit(1)

def getName(myname):
    if isfile(myname):
        if myname.split("/")[-1].endswith(".txt"):
            f = open(myname, 'r')
            res = f.read()
            f.close()
            return myname
    else:
        for i in os.listdir(myname):
            if isfile(os.path.join(myname, i)):
                return {"name": os.path.join(myname, i), "content": getName(os.path.join(myname, i))}
            else:
                return getName(os.path.join(myname, i))

file_folder_dict = getName(myname)

print file_folder_dict

在我的例子中,如何改进它?

根据您的示例输出,似乎您假设某个目录中只有一个txt文件,并且可能有多个子目录。下面是在此假设下使用递归的代码。getname()的参数应该是目录的路径

import sys
import os
import json

def readfile(filepath):
    f = open(filepath)
    res = f.read()
    f.close()
    return res.strip()

def getname(dirpath):
    onlyfile = [entry for entry in os.listdir(dirpath) \
            if os.path.isfile(os.path.join(dirpath, entry)) \
            and entry.endswith(".txt")][0]
    onlyfilename = os.path.join(dirpath, onlyfile)

    decendent = []
    for entry in os.listdir(dirpath):
        entrypath = os.path.join(dirpath, entry)
        if os.path.isfile(entrypath):
            # we have handled this one, i.e. 'onlyfile'
            continue
        decendent.append(getname(entrypath))

    if len(decendent) == 0:
        decendent = None

    return {'name': onlyfilename,
            'content': readfile(onlyfilename),
            'decendent': decendent}


if __name__ == "__main__":
    dirpath = sys.argv[1]
    result = getname(dirpath)
    print json.dumps(result, indent=4)
下面是示例目录结构的输出:

$ python xx.py directory
{
    "content": "Name 1", 
    "name": "directory/name.txt", 
    "decendent": [
         {
            "content": "Name 2", 
            "name": "directory/subdir/name.txt", 
            "decendent": null
        }, 
        {
            "content": "Name 3", 
            "name": "directory/subdir2/name.txt", 
            "decendent": [
                {
                    "content": "Name 4", 
                    "name": "directory/subdir2/subdir3/name.txt", 
                    "decendent": null
                }
            ]
        }
    ]
}

那么os.walk()呢?请参阅os.walk:What'sgrough with it'?