-1

我的 linux 机器上的目录中有大约 125 个文件。我有一个名为 annotate.py 的脚本,它接收一个文件并将功能添加到一列。本质上,我可以输入 125 个文件之一的文件名并运行 annotate.py 脚本,但这不是有效的编程。

所有 125 个文件在列名和列号方面都具有相似的格式。那么有人可以告诉我如何在所有 125 个文件上运行 annotate.py 吗?

annotate.py 合并染色体和位置列上的两个文件。但是,我希望 input_file1 成为一次读取一个并与 input_file2 合并的所有 125 个文件。输出应该是不同的文件,每个文件都具有原始输入文件 1 的名称。

#!/usr/bin/python
#python snp_search.py  input_file1 input_file2
import numpy as np
import pandas as pd

snp_f=pd.read_table('input_file1.txt', sep="\t", header=None)#input_file1
snp_f.columns=['chr','pos']
lsnp_f=pd.read_table('input2_snpsearch.txt', sep="\t", header=True)#input_file2
lsnp_f.columns=['snpid','chr','pos']
final_snp=pd.merge(snp_f,lsnp_f, on=['chr','pos'])
final_snp.to_csv('input_file1_annotated.txt', index=False,sep='\t')

请帮忙!谢谢!

4

1 回答 1

0

os模块是你的朋友http://docs.python.org/2/library/os.html。基本思想是 toimport os和 useos.listdir()获取您感兴趣的目录中的文件列表。如下所示。

import numpy as np
import pandas as pd
import os


input_file2 = 'input2_snpssearch.txt'
input_dir = './' #or any other path
files = os.lisdir(input_dir) #listdir will give the file names

#you probably don't want to merge your input_file2 with itself and
#in this case it's in the same directory as the other files so
#filter it out.
files_of_interest = (f for f in files if f != input_file2)

for f in files_of_interest:
    full_name = os.path.join(input_dir, f) #necessary if input_dir is not './'
    snp_f=pd.read_table(full_name, sep="\t", header=None)#input_file1
    snp_f.columns=['chr','pos']
    lsnp_f=pd.read_table(input_file2, sep="\t", header=True)#input_file2
    lsnp_f.columns=['snpid','chr','pos']
    final_snp=pd.merge(snp_f,lsnp_f, on=['chr','pos'])
    new_fname = f.split('.')[0] + '_annotated.txt'
    final_snp.to_csv(os.path.join(input_dir, new_fname), index=False,sep='\t')
于 2013-08-08T01:24:34.783 回答