1

我是使用bioservicesPython 包的新手。现在我将使用它来检索两个引用的 PMID,给定指定的信息,这是我尝试过的代码:

from bioservices import EUtils
s = EUtils()
print(s.ECitMatch("pubmed",retmode="xml", bdata="proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|%0Dscience|1987|235|182|palmenberg+ac|Art2|"))

但是会出现错误:

“TypeError:ECitMatch() 获得了参数‘bdata’的多个值”。

谁能帮我解决这个问题?

4

2 回答 2

0

我认为问题在于您有一个未命名的参数(pubmed);如果您查看源代码,您可以看到第一个参数应该是bdata;但是,如果您像您一样提供参数,则不清楚bdatais"pubmed"或命名参数bdata,因此您获得的错误。

你可以用这个最小的例子来重现它:

def dummy(a, b): 
   return a, b

dummy(10, a=3)

将返回

TypeError: dummy() 为参数 'a' 获得了多个值

如果您删除"pubmed",错误就会消失,但是,输出仍然不完整:

from bioservices import EUtils

s = EUtils()

print(s.ECitMatch("proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|%0Dscience|1987|235|182|palmenberg+ac|Art2|"))

返回

'proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|2014248\n'

所以只考虑第一个出版物。您可以通过使用正确的回车符 来获得两者的结果\r

print(s.ECitMatch(bdata="proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|\rscience|1987|235|182|palmenberg+ac|Art2|"))

将返回

proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|2014248
science|1987|235|182|palmenberg+ac|Art2|3026048

我认为您既不必指定retmod也不必指定数据库(pubmed);如果您查看我上面链接的源代码,您可以看到:

query = "ecitmatch.cgi?db=pubmed&retmode=xml"

所以似乎它总是使用pubmedand xml

于 2020-06-04T20:46:42.133 回答
0

这里有两个问题:语法和错误。

正确的语法是:

    from bioservices import EUtils
    s = EUtils()
    query = "proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|%0Dscience|1987|235|182|palmenberg+ac|Art2|"
    print(s.ECitMatch(query))

实际上,与 ICitMatch 相关的底层服务只有一个数据库(pubmed)和一种格式(xml),因此,这两个参数不可用:有硬编码。因此,只需要一个参数:您的查询。

至于第二个问题,如上所述并在 bioservices 问题页面上报告,您的查询将仅返回一个出版物。这是 URL 请求未正确解释特殊字符 %0D(代替回车)的问题。这个回车符(\n、\r 或 %0d)现在在 github 上的最新版本或 pypi 网站(如果您使用版本 1.7.5)中被考虑在内

感谢willigot在 bioservices 页面上填写问题并引起我的注意。

免责声明:我是生物服务的主要作者

于 2020-06-15T11:24:00.807 回答