Используйте 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)