Python 如何使用文件内容中的节点名称从fs创建嵌套字典?
我需要进入目录并查看-是否有扩展名为.txt的文件,如果有-提取此文件的内容并用此内容替换当前目录的名称。之后,向前移动到子目录并执行相同的操作 例如: 输入时: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':
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'?