Как использовать несколько переменных, читаемых из файла с циклическим подпроцессом / popen - PullRequest
1 голос
/ 28 ноября 2011

Я использую Python для чтения 2 файлов из моей ОС Linux. Один содержит одну запись / номер «ДАТА»:

20111125

другой файл содержит много записей, 'TIME':

042844UTC
044601UTC
...
044601UTC

Я могу прочитать файлы, чтобы назначить соответствующие переменные. Затем я хотел бы использовать переменные для создания путей к папкам, перемещения файлов и т. Д., Например:

$PATH/20111125/042844UTC
$PATH/20111125/044601UTC
$PATH/20111125/044601UTC

и т. Д.

Почему-то это не работает с несколькими переменными, переданными одновременно:

import subprocess, sys, os, os.path
DATEFILE = open('/Astronomy/Sorted/2-Scratch/MAPninox-DATE.txt', "r")
TIMEFILE = open('/Astronomy/Sorted/2-Scratch/MAPninox-TIME.txt', "r")
for DATE in DATEFILE:
    print DATE,
for TIME in TIMEFILE:
    os.popen('mkdir -p /Astronomy/' + DATE + '/' TIME) # this line works for DATE only
    os.popen('mkdir -p /Astronomy/20111126/' + TIME) # this line works for TIME only
    subprocess.call(['mkdir', '-p', '/Astronomy/', DATE]), #THIS LINE DOESN'T WORK

Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Я бы предложил использовать os.makedirs (что аналогично mkdir -p) вместо subprocess или popen:

import sys
import os
DATEFILE = open(os.path.join(r'/Astronomy', 'Sorted', '2-Scratch', 'MAPninox-DATE.txt'), "r")
TIMEFILE = open(os.path.join(r'/Astronomy', 'Sorted', '2-Scratch', 'MAPninox-TIME.txt'), "r")

for DATE in DATEFILE:
    print DATE,

for TIME in TIMEFILE:
    os.makedirs(os.path.join(r'/Astronomy', DATE, TIME))

    astrDir = os.path.join(r'/Astronomy', '20111126', TIME)
    try
        os.makedirs(astrDir)
    except os.error:
        print "Dir %s already exists, moving on..." % astrDir
    # etc...

Затем используйте shutil для любых операций cp / mv / etc.


Из os Документов :

os.makedirs(path[, mode])
Рекурсивная функция создания каталогов.Подобно mkdir(), но создает все каталоги промежуточного уровня, необходимые для хранения конечного каталога.Вызывает исключение ошибки, если конечный каталог уже существует или не может быть создан.Режим по умолчанию - 0777 (восьмеричное).В некоторых системах режим игнорируется.Там, где оно используется, текущее значение маски сначала маскируется.

1 голос
/ 28 ноября 2011

Я вижу пару ошибок в вашем коде.

os.popen('mkdir -p /Astronomy/' + DATE + '/' TIME) # this line works for DATE only

Это синтаксическая ошибка. Я думаю, что вы хотели иметь '/' + TIME, а не '/' TIME. Я не уверен, что вы подразумеваете под "эта строка работает только для DATE"?

subprocess.call(['mkdir', '-p', '/Astronomy/', DATE]), #THIS LINE DOESN'T WORK

Какую команду вы ожидаете вызвать? Я догадываюсь из остальной части вашего кода, что вы пытаетесь выполнить mkdir -p /Astronomy/<<DATE>>. Это не то, что вы кодировали, хотя. Каждый элемент в списке, который вы передаете subprocess.call, является отдельным аргументом, поэтому то, что вы написали, выглядит как mkdir -p /Astronomy <<DATE>>. Это попытается создать два каталога, каталог корневого уровня /Astronomy и еще один каталог в текущем рабочем каталоге с именем независимо от того, что DATE является.

Если я прав относительно того, что вы хотели сделать, исправленная строка будет выглядеть так:

subprocess.call(['mkdir', '-p', '/Astronomy/' + DATE])

ответ Чоуна, использующий os.makedirs (и использующий os.path.join для объединения путей, а не строки +), на мой взгляд, является лучшим общим подходом. Но именно поэтому ваш текущий код не работает, насколько я могу судить.

...