根据输入文件名路径列表将输出写入子目录位置中的文件

时间:2014-10-11 20:48:15

标签: python sys

我有一个txt文件,其中包含具有此名称格式的各种子目录的文件名列表:

./A_blurb/test.txt
./B_foo/bar.txt
./B_foo/bric.txt
etc..

我还有脚本循环遍历文件名列表中的行并生成适当的输出。

我想要的是在与文件名列表中提供的路径对应的目录中保存具有不同名称的文件的输出。

我编写的代码指示在命令行运行脚本的目录中的所有输出(每个for循环1个),如“shell$ python script.py inputfilelist.txt

这是我的剧本:

import sys

with open(sys.argv[1]) as f:
    for filename in f:
        with open(filename.strip().strip("\n"),'a') as f1:
            #print f1
            output = []
            outfilename = filename.strip("\n").lstrip("./").replace("/", "__") + "out.txt"
            #print outfilename
            with open(outfilename, 'a') as outfile:
                line = f1.readline()
                while line and not line.startswith('GO-ID'):
                    line = f1.readline()
                data = f1.readlines()
                for line in data: 
                    line = line.split("\t")
                    GOnr = line[0].lstrip("\s")
                    pvalue = line[1].strip()
                    corrpval = float(line[2].strip())
                    if corrpval <= 0.05:
                        outstring = "GO:"+"%s %s" % (GOnr, str(corrpval))
                        outfile.write(outstring + "\n")
                        #print outstring

我正在寻找最简单的方法让每个循环将其outfile保存在与文件名输入路径相同的位置。

假设我必须使用sys模块,但阅读python提供了解释,我不太了解如何使用sys.stdin sys.stdout函数。

相反,我一直在尝试这种方法,通过定义一个函数,从文件列表重新格式化输入目录,为每个新的out.txt文件生成一个完整路径。

def output_name(input_file):
    file_line=inputfile.strip()
    line_as_list=file_line.split("/")
    line_as_list.append("out.txt")     # file name
    line_as_list.remove(line_as_list[-2])  # remove file name of input file from path                     description 
    full_output_name="/".join(line_as_list) #join to add leading and intermittent `/` 
    return full_output_name 

当我以交互方式运行此代码段时,它也会执行它所需要的内容,例如:outputname("./A_blurb/test.txt") == "./A_blurb/out.txt" 但是,当我在命令行运行它时,我收到以下消息:return full_output_name \n SyntaxError: 'return' outside function

我仔细检查了缩进但无法找到导致此错误消息的原因.... 感谢。

2 个答案:

答案 0 :(得分:0)

您的脚本将文件保存到从输入路径推导出的输出路径。

没关系。您不应该尝试同时读取和重写文件。情况很复杂。创建另一个文件,然后将其移动以覆盖原始文件更容易。

在标准库中尝试os.rename()(或者shutil.move()):

# After closing the output file and the input file
os.rename(temporary_output_path, input_path)

答案 1 :(得分:0)

问题末尾的代码实际上工作正常。以下是我的问题的工作答案。

给出要循环的文件列表

string = """"
./A_blurb/test.txt
./B_foo/bar.txt
./B_foo/bric.txt
"""

下面的函数生成一个与字符串格式相同的列表,但删除file.txt并添加out

def output_name(name_in):
    file_line = name_in.strip()
    line_as_list = file_line.split("/")
    line_as_list.append("out.txt")     ## generate file name
    line_as_list.remove(line_as_list[-2])  ## remove the file name
    full_output_name="/".join(line_as_list) # join fields in the list with `/`
    return full_output_name # return the re-formatted file path

这是输出:

./A_blurb/out.txt
./B_foo/out.txt
./B_foo/out.txt

然后主脚本遍历此列表并使用每一行作为open(outfilename, 'w')的名称,结果是'out.txt'文件写在相应的目录中,用作脚本的输入