Используйте xonsh для циклического перебора файлов с помощью ls

Я хочу использовать xonsh для bzip нескольких файлов в каталоге. Я сначала попробую это со следующим:

$ ls
table_aa.csv    table_amgn.csv  table_csco.csv  table_esrx.csv  table_hal.csv  table_jbl.csv  table_pcg.csv   table_zmh.csv
table_aapl.csv  table_amzn.csv  table_d.csv     table_gas.csv   table_hp.csv   table_jpm.csv  table_usb.csv
$ for fn in ls:
..    bzip2 fn
..
NameError: name 'ls' is not defined

Хорошо, так что я использую $() эксплицитно

$ for fn in $(ls).split():
.     bzip2 fn
bzip2: Can't open input file fn: No such file or directory.
bzip2: Can't open input file fn: No such file or directory.

Есть лучший способ сделать это?

$ xonsh --version
('xonsh/0.3.4',)

2 ответа

Решение

Вы очень близки со вторым примером. Единственное, что следует отметить, это то, что fn это имя переменной Python, поэтому вы должны использовать @() передать его в подпроцесс:

$ for fn in $(ls).split(): . bzip2 @(fn)

Кроме того, в v0.3.4 вы можете использовать регулярное выражение вместо ls,

$ for fn in `.*`: . bzip2 @(fn)

И, по крайней мере, на master, теперь вы можете перебирать!() Построчно, что означает, что следующее также будет работать, если вы привязаны к ls:

$ for fn in !(ls): . bzip2 @(fn)

С помощью ls:

for fn in !(ls):
    print(fn.rstrip())

Использование globs (доступно в виде регулярных выражений, shell и path):

for fn in g`*`:
    print(fn)

Использование API-интерфейсов Python (см. Модули os, glob или pathlib):

import os
for fn in os.listdir():
    print(fn)
Другие вопросы по тегам