Python循环一个进程,输出作为输入之一

时间:2017-05-19 23:46:55

标签: python

我有一个python进程,它接收两个输入文件并写出一个输出文件:

def process(fin1,fin2,fout):
    outf = fileout(fout)
    x = readcsv(fin1)
    y = readcsv(fin2)
    hlen = writeheaders(fin1,fin2,outf)
    sub(matchingfields(x,y),x,y,hlen,outf)
    outf.close()

我可以像这样轻松地运行它,(定义输出文件的名称):

process('csv1a.csv','csv2b.csv','OUTv1.csv')

我想输入两个以上的文件(拖放到批处理文件或使用cmd):

filenames = sys.argv[1:]

所以问题是如何轻松(递归?)循环我的进程,以便:

使用文件名[1]

在文件名[0]上运行进程

使用文件名[2]

运行(filenames [0] + filenames [1])输出的进程

使用文件名[3]

运行(filenames [0] + filenames [1] + filenames [2])输出的进程

等。

我对编程很新,并且无法找到解决此问题的最佳方法。提前谢谢!!

2 个答案:

答案 0 :(得分:0)

您已经发现sys.argv可以使用len(sys.argv)-1来查找传递给脚本的文件数量。 通常,len()为您提供数组的长度。

然后你会创建一个for循环,循环遍历所有传递的文件输入,从第三个开始,除了最后一个,因为这是输出文件。 对于每个输入文件,您使用现有输出文件和此迭代的新文件,并使用现有函数运行它并将结果写入输出文件。

在开始时,您应该使用输入文件1和2以及输出文件作为输出来运行现有方法。

答案 1 :(得分:0)

对于拖放操作,请创建包含

的批处理文件
@echo off
python myscript.py %*

并将其另存为myscript.bat。您现在可以在其上拖放文件,它会将所有文件名作为参数传递给您的脚本。

我建议不要在文件中反复地来回处理所有数据,而是在内存中处理它,然后将最终结果写入磁盘。

import sys

def read_csv(fname):
    # read csv file into memory
    # YOUR CODE GOES HERE
    return data

def write_csv(data, fname):
    # write data out to file
    # YOUR CODE GOES HERE

def merge(data1, data2):
    # YOUR CODE GOES HERE
    return merged_data

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python {} file1.csv file2.csv [...]".format(__name__))
    else:
        data = read_csv(sys.argv[1])
        for fname in sys.argv[2:]:
            more_data = read_csv(fname)
            data = merge(data, more_data)
        write_csv(data, "final.csv")