-2

我在 Python 中使用以下命令获取文件或目录的完整路径的输出:

command = subprocess.Popen(['sshpass', '-p', password, 'rsync', '--recursive', source],
                           stdout=subprocess.PIPE).communicate()[0]

我得到了问题中的输出。现在我想打破我的输出:

home
 username
   ok
     ok.txt

尝试使用:command.split('\')但没有用。打破后我想让用户也选择每个文件或目录。我怎样才能做到这一点?谢谢

编辑:实际上它是一个列表,但我使用 Django 模板中的连接打破了它,所以我猜它现在是一个字符串。现在输出是这样的:

django
django/genelaytics
django/genelaytics/.project
django/genelaytics/.pydevproject
django/genelaytics/manage.py
django/genelaytics/fileupload
django/genelaytics/fileupload/__init__.py
django/genelaytics/fileupload/__init__.pyc
django/genelaytics/fileupload/form.html~
django/genelaytics/fileupload/forms.py
django/genelaytics/fileupload/forms.pyc
django/genelaytics/fileupload/models.py

期望的输出:

django
  genelaytics
    .project
     .pydevproject

我想要文件和文件夹的树结构。谢谢

如果从字符串转换为树很难,我也有这种列表:

['django', 'django/genelaytics', 'django/genelaytics/.project', 'django/genelaytics/.pydevproject', 'django/genelaytics/manage.py', 'django/genelaytics/fileupload', 'django/genelaytics/fileupload/__init__.py', 'django/genelaytics/fileupload/__init__.pyc']

我想要与上面相同的输出。如果从字符串转换树很容易,我会这样做,否则如果从列表转换树很容易,让我们做任何容易的事情。不是问题!

4

3 回答 3

3

我认为这会让你达到 99% 那里..

t = "/home/username/ok/ok.txt"
for i,j in enumerate(t.split("/")):
    print i * " " + j

 home
  username
   ok
    ok.txt

对于 python ,字符串可以是多个数字,如下所示:

"a" * 3
output: 'aaa'

并且 enumerate 将返回一个元组,该元组的第一个元素是可迭代对象的索引。

for i in enumerate(t.split("/")):
    print i


output: (0, '')
output: (1, 'home')
output: (2, 'username')
output: (3, 'ok')
output: (4, 'ok.txt')
于 2012-12-04T05:26:46.777 回答
2

我可能会误解,但假设你有这样的字符串,这行得通吗?

In [14]: s = '/home/username/ok/ok.txt'

In [15]: for index, el in enumerate(s.split('/')[1:]):
   ....:     print '  ' * index + el
   ....:
   ....:

  home
    username
      ok
        ok.txt

这将遍历拆分字符串,跳过第一个(空白)元素并打印出前面有两个空格乘以当前索引(0、1、2 等)的元素。不确定您要使用什么界面来允许选择,但我想您可以执行以下操作:

In [23]: for index, el in enumerate(s.split('/')[1:]):
   ....:     print '[{0}] {1}{2}'.format(index + 1, index * ' ', el)
   ....:
   ....:
[1] home
[2]  username
[3]   ok
[4]    ok.txt

这与上面的基本相同,添加一个“标记”并使用字符串格式来显示字符串。要允许使用 进行选择raw_input,您可以尝试以下操作:

In [26]: my_path = s.split('/')[1:]

In [27]: my_path
Out[27]: ['home', 'username', 'ok', 'ok.txt']

In [28]: choice = int(raw_input(('Enter choice: ')))
Enter choice: 2

In [29]: print my_path[choice-1]
username
于 2012-12-04T05:24:44.903 回答
2

考虑使用os.path.split.

于 2012-12-04T05:28:56.327 回答