【问题标题】:Why can I not create a simple loop? [duplicate]为什么我不能创建一个简单的循环? [复制]
【发布时间】:2016-10-13 20:24:13
【问题描述】:

我正在尝试创建一个从 dna 序列文件中读取酶切片段的简单程序。我的问题是我无法让第一个块在循环中重复。我在做什么错所以我可以把它变成一个循环?非常感谢任何帮助,谢谢!

sequence = open('sequence.txt').read().replace('\n','')
enzymes = {}
fh = open('enzymes.txt')
print('Restriction Enzyme Counter')
inez = input('Enter a Restricting Enzyme: ')
def servx():
    for line in fh.readlines():
        (name, site, junk, junk) = line.split()
        enzymes[name] = site 
        if inez in line:
            xcr = site
            print('Active Bases:', site)
    for line in sequence.split():
        if xcr in line:
            bs = (sequence.count(xcr))
            print('Enzyme', inez, 'appears', bs, 'times in Sequence.')
servx()
inez = input('Find another Enzyme? [Yes/No]:')
if inez is 'Yes':
    servx()
fh.close()

【问题讨论】:

  • 你怎么知道你的循环没有运行?
  • 如果你把你的函数放在顶部,然后在代码运行时放置几个空行,通常会更易读。
  • 请注意,您调用了您的servx 函数两次,但第二次调用它时,fh 文件句柄已经耗尽,因此循环不会运行。这是问题吗?不过,第一次调用它应该运行良好。
  • 它确实跳过循环,否则您将不会得到“Enzyme AarI 在序列中出现 12 次”输出。它只是在您第二次调用该函数时跳过循环,正如我所说的,因为文件迭代器已经用尽了。寻找重复关闭。
  • 即使进行了更正,这也是非常低效的。您应该查看字典并在重复循环之前一步完成所有预处理。即便如此,它也只会额外运行一次。

标签: python


【解决方案1】:

你有可能不会做你认为它做的事:

for line in fh.readlines():

.readlines() 读取整个文件并返回它读取的内容。因此,当您这样做时,循环中的 line 变量不仅是文件的一行,而且是整个文件。所以你的 for 循环只运行一次,因为在第一个循环之后没有其他东西可以在文件中迭代,因为你读到了文件结尾。基本上你确实从文件中读取了一行,但你一口气用完了整个文件。

我认为您想要做的是一次读取一行,直到文件结束:

for line in fh:

或者更好的方式一起读取文件是:

with open('filename.txt') as fh:
    for line in fh:
        print(line)

最后一种方法不需要您fh.close() 它为您处理的文件。但请注意最后一种方法如何也使用for line in fh:

【讨论】:

  • line变量一行,但是文件句柄会用完。
  • 对,这不是问题所在,我认为 OP 想一次读一行,我认为我输入的内容不够清楚。即使此主题已关闭,也会更新。
【解决方案2】:

您的代码中有一个问题会阻止您的函数 servx() 多次运行:

if inez is 'Yes':

这会检查inez 是否与文字字符串'Yes' 相同。出于所有意图和目的,这将始终返回 false。你想要的是这个:

if inez == 'Yes'

根据这里的问题,检查字符串是否匹配,而不是对象实例本身:Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?

【讨论】:

  • inez is 'Yes' 会返回True,你自己试试吧。该变量是对文字字符串的引用。见id(a)id('foo')
  • @solarc 我在 python 控制台中尝试了它,它为我返回了False。那你知道为什么会这样吗?我在这里基于这个问题:stackoverflow.com/questions/1504717/…
  • 有趣。似乎id('yes')id(''.join(('y','e','s'))) 不同。我以为他们最终会是一样的。这将导致'yes' == ''.join(('y','e','s')) 为真但'yes' is ''.join(('y','e','s')) 为假。我今天学到了一些新东西。
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2011-07-19
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多