Как сделать! Rm python_var (в блокнотах Jupyter) - PullRequest
0 голосов
/ 29 декабря 2018

Я знаю, что могу сделать это:

CSV_Files = [file1.csv, file2.csv, etc...]

%rm file1.csv
!rm file2.csv

но как я могу сделать это как переменную.например.

TXT_Files = [ABC.txt, XYZ.txt, etc...]

for file in TXT_Files:
  !rm file

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

rm может удалить несколько файлов за вызов:

In [80]: !touch a.t1 b.t1 c.t1
In [81]: !ls *.t1
a.t1  b.t1  c.t1
In [82]: !rm -r a.t1 b.t1 c.t1
In [83]: !ls *.t1
ls: cannot access '*.t1': No such file or directory

Если отправной точкой является список имен файлов:

In [116]: alist = ['a.t1', 'b.t1', 'c.t1']
In [117]: astr = ' '.join(alist)            # make a string
In [118]: !echo $astr                       # variable substitution as in BASH
a.t1 b.t1 c.t1
In [119]: !touch $astr                    # make 3 files
In [120]: ls *.t1
a.t1  b.t1  c.t1
In [121]: !rm -r $astr                    # remove them
In [122]: ls *.t1
ls: cannot access '*.t1': No such file or directory

Возможно, работа с собственными функциями ОС Python, вероятно,лучше, но вы можете делать то же самое с% magics - если вы достаточно хорошо понимаете shell.


Чтобы использовать 'magics' в выражении Python, я должен использовать базовые функции, а не'!'или синтаксис «%», например

import IPython
for txt in ['a.t1','b.t1','c.t1']:
    IPython.utils.process.getoutput('touch %s'%txt)

Функция getoutput используется %sx (что лежит в основе !!), которая использует subprocess.Popen.Но если вы приступите ко всей этой работе, вы также можете использовать функции os, которые предоставляет сам Python.


Для имен файлов может потребоваться дополнительный уровень цитирования, чтобы гарантировать, что оболочка недать синтаксическую ошибку:

In [129]: alist = ['"a(1).t1"', '"b(2).t1"', 'c.t1']
In [130]: astr = ' '.join(alist)
In [131]: !touch $astr
In [132]: !ls *.t1
'a(1).t1'   a.t1  'b(2).t1'   b.t1   c.t1
0 голосов
/ 29 декабря 2018

Вы можете справиться с этим в Python без магических команд оболочки.Я рекомендую использовать модуль pathlib, для более современного подхода.Для того, что вы делаете, это будет:

import pathlib
csv_files = pathlib.Path('/path/to/actual/files')
for csv_file in csv_files.glob('*.csv'):
    csv_file.unlink()

Используйте метод .glob() для фильтрации только тех файлов, которые вы хотите использовать, и .unlink() для их удаления (что аналогично os.remove()).

Не используйте file в качестве переменной, поскольку это зарезервированное слово в языке.

...