【问题标题】:Creating loop for __main__为 __main__ 创建循环
【发布时间】:2015-06-06 21:32:59
【问题描述】:

我是 Python 新手,希望得到您的建议。

我有一个脚本,一次运行一个输入值,我希望它能够运行这些值的整个列表,而无需我一次输入一个值。我有一种预感,下面列出的主要方法需要一个“for 循环”。值是“gene_name”,所以有效地,我想输入一个脚本可以很好地运行的“gene_names”列表。

希望我的问题表述正确,谢谢!有问题的块似乎是

def get_probes_from_genes(gene_names)

   import json
   import urllib2
   import os
   import pandas as pd

   api_url = "http://api.brain-map.org/api/v2/data/query.json"

   def get_probes_from_genes(gene_names):
       if not isinstance(gene_names,list):
           gene_names = [gene_names]
       #in case there are white spaces in gene names
       gene_names = ["'%s'"%gene_name for gene_name in gene_names]**

       api_query = "?criteria=model::Probe"
       api_query= ",rma::criteria,[probe_type$eq'DNA']"
       api_query= ",products[abbreviation$eq'HumanMA']"
       api_query= ",gene[acronym$eq%s]"%(','.join(gene_names))
       api_query= ",rma::options[only$eq'probes.id','name']"

       data = json.load(urllib2.urlopen(api_url api_query))

       d = {probe['id']: probe['name'] for probe in data['msg']}

       if not d:
           raise Exception("Could not find any probes for %s gene. Check " \
           "http://help.brain-    map.org/download/attachments/2818165/HBA_ISH_GeneList.pdf?    version=1&modificationDate=1348783035873 " \
           "for list of available genes."%gene_name)

       return d

   def get_expression_values_from_probe_ids(probe_ids):
       if not isinstance(probe_ids,list):
           probe_ids = [probe_ids]
       #in case there are white spaces in gene names
       probe_ids = ["'%s'"%probe_id for probe_id in probe_ids]

       api_query = "?    criteria=service::human_microarray_expression[probes$in%s]"%    (','.join(probe_ids))
       data = json.load(urllib2.urlopen(api_url api_query))

       expression_values = [[float(expression_value) for expression_value in     data["msg"]["probes"][i]["expression_level"]] for i in range(len(probe_ids))]
       well_ids = [sample["sample"]["well"] for sample in data["msg"]    ["samples"]]
       donor_names = [sample["donor"]["name"] for sample in data["msg"]    ["samples"]]
       well_coordinates = [sample["sample"]["mri"] for sample in data["msg"]    ["samples"]]

       return expression_values, well_ids, well_coordinates, donor_names

   def get_mni_coordinates_from_wells(well_ids):
       package_directory = os.path.dirname(os.path.abspath(__file__))
       frame = pd.read_csv(os.path.join(package_directory, "data",     "corrected_mni_coordinates.csv"), header=0, index_col=0)

       return list(frame.ix[well_ids].itertuples(index=False))

   if __name__ == '__main__':
       probes_dict = get_probes_from_genes("SLC6A2")
       expression_values, well_ids, well_coordinates, donor_names =     get_expression_values_from_probe_ids(probes_dict.keys())
       print get_mni_coordinates_from_wells(well_ids)

【问题讨论】:

    标签: python loops methods main args


    【解决方案1】:

    哇,第一件事。 Python 不是 Java,所以请帮自己一个忙,使用漂亮的 """xxx\nyyy""" 字符串,用三引号表示多行。

     api_query = """?criteria=model::Probe"
                 ,rma::criteria,[probe_type$eq'DNA']
                 ...
                 """
    

    或类似的东西。你会得到输入的空格,所以你可能需要调整。

    如果像建议的那样,您选择通过文件循环调用您的函数,您将需要尝试/排除您的 data-not-found 异常,或者您需要在不引发异常的情况下处理丢失的数据。我会选择自己返回一个空结果,让调用者担心如何处理它。

    如果您确实选择引发异常,请创建自己的异常,而不是使用通用异常。这样您的代码就可以首先捕获您预期的异常。

    class MyNoDataFoundException(Exception):
        pass
    
    #replace your current raise code with...
    if not d:
        raise MyNoDataFoundException(your message here)
    

    关于捕获异常的说明,以接受的答案为起点:

    if __name__ == '__main__':
        with open(r"/tmp/genes.txt","r") as f:
            for line in f.readlines():
    
                #keep track of your input data
                search_data = line.strip()
                try:
                    probes_dict = get_probes_from_genes(search_data)
                except MyNoDataFoundException, e:
                    #and do whatever you feel you need to do here...
                    print "bummer about search_data:%s:\nexception:%s" % (search_data, e)
    
                expression_values, well_ids, well_coordinates, donor_names =     get_expression_values_from_probe_ids(probes_dict.keys())
                print get_mni_coordinates_from_wells(well_ids)
    

    【讨论】:

    • 别介意关于列表理解的一点,我学到了一些关于从列表中构建字典的知识。删除。
    • 非常感谢你。我希望我可以投票,但我没有足够的代表。请问,哪一行是捕捉到“找不到数据”的情况?就像 .csv 文件中有空格一样,我如何指定代码来捕捉它?(如果您已经在上面输入了它,请道歉)
    • 当你有代表时,你可以随时投票 ;-)
    • 嘿@JL Peyret,快速提问。 “除了 MyNoDataFoundException, e: #and do what you feel you need to do here...” 是什么意思?比如我在'e'中放了什么,你说的#评论是什么意思?谢谢!
    • 好吧,只做你认为适合你使用的事情。你捕捉到异常,你可以忽略它,或者你可以编写代码来处理你的查询没有返回任何数据的事实。这是你的电话 - 我只是说你不能很好地拥有抛出预期异常的代码 - (还记得你自己的异常吗?),在一个循环中。第一个异常,如果未处理,将终止循环。
    【解决方案2】:

    您可能想要创建一个带有基因名称的文件,然后读取文件的内容并在循环中调用您的函数。下面是一个例子

    if __name__ == '__main__':
      with open(r"/tmp/genes.txt","r") as f:
          for line in f.readlines():
              probes_dict = get_probes_from_genes(line.strip())
              expression_values, well_ids, well_coordinates, donor_names =     get_expression_values_from_probe_ids(probes_dict.keys())
              print get_mni_coordinates_from_wells(well_ids)
    

    【讨论】:

    • 嘿 Kozyarchuk,我是不是把它放在上面整个代码块的前面?我可以用“genes.csv”文件替换“/tmp/genes.txt”吗?它的工作方式相同吗?我发现了这一点,我认为我应该使用示例 3:pythonforbeginners.com/systems-programming/…。谢谢!
    猜你喜欢
    • 2021-12-21
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多