-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 など) を掛けた 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 に答える