Кажется преждевременным превращать это в функцию - он жестко запрограммирован для работы только с 3 «файловыми» параметрами, и даже если он модифицирован как один параметр, он все равно привязан к расширению ".Z"
. Это делает его по существу полезным только для одной ультраспецифической задачи c: распаковка точно 3 файлов (действительно каталогов ...) с конкретным расширением c.
Кроме того, кажется, что существует путаница между каталогами и путями к файлам; os.listdir
извлекает все файлы в каталоге, что, кажется, противоречит тому, как вы назвали свои переменные, что предполагает, что вы передаете пути к файлам.
В любом случае, вы можете удалить несколько блоков в своей функции и передать в папку root путь, или, наоборот, пропустить os.listdir
и указать прямой единственный путь к subprocess.call
.
Я бы предложил написать встроенный код:
for path in os.listdir('/root/xxx/'):
if path.endswith('.Z') and ret := subprocess.call(['gunzip', path]):
raise IOError(f'gunzip exited with code {ret} on {path}')
Если вы действительно делаете это так часто, что для вызывающего абонента это слишком много, вы можете использовать:
def unzip_all(directory, extension='.Z'):
for path in os.listdir(directory):
if path.endswith(extension) and ret := subprocess.call(['gunzip', path]):
raise IOError(f'gunzip exited with code {ret} on {path}')
И если вы хотите извлечь только 3 указанных c файла вместо 3 указанных c каталогов:
for path in ['root/xxx/foo.Z', 'root/xxx/bar.Z', 'root/xxx/baz.Z']:
if ret := subprocess.call(['gunzip', path]):
raise IOError(f'gunzip exited with code {ret} on {path}')
Поскольку gunzip
принимает несколько аргументов, вы можете воспользоваться что все сводится к следующему:
paths = ['root/xxx/foo.Z', 'root/xxx/bar.Z', 'root/xxx/baz.Z']
if ret := subprocess.call(['gunzip'] + paths):
raise IOError(f'gunzip exited with code {ret} on {paths}')
Обратите внимание, что здесь используется синтаксис присваивания усов :=
в Python 3.8.
В качестве отступления,
else:
if:
....
- более сложный способ написания
elif:
....
Я рекомендую следовать PEP-8 ; функции должны быть lower_camel_case
. UpperCamelCase
зарезервировано для классов.