我有一个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])输出的进程等。
我对编程很新,并且无法找到解决此问题的最佳方法。提前谢谢!!
答案 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")