如何使用循环子进程/ popen从文件中读取多个变量

时间:2011-11-28 02:47:13

标签: python variables subprocess popen

我正在使用python从我的linux操作系统中读取2个文件。一个包含一个条目/数字' DATE':

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 个答案:

答案 0 :(得分:2)

我建议使用os.makedirs(与mkdir -p完全相同)而不是subprocesspopen

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 Docs

  

<强> os.makedirs(path[, mode])
  递归目录创建功能。像mkdir()一样,但是全部都是如此   包含叶子目录所需的中级目录。   如果leaf目录已存在,则引发错误异常   无法创建。默认模式为0777(八进制)。在某些系统上,   模式被忽略。在使用它的地方,首先是当前的umask值   掩盖了。

答案 1 :(得分:1)

我在你的代码中看到了一些错误。

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来拼接路径而不是字符串+)的chown答案是一种更好的通用方法。但就我所知,这就是你当前代码无效的原因。