防止在 Python 中关闭文件

Prevent closing file in Python

我在从文件中读取字符时遇到问题。我有一个名为 fst.fasta 的文件,我想知道字母 AT.

出现的次数

这是第一个代码示例:

f = open("fst.fasta","r")
a = f.read().count("A")

t = f.read().count("T")

print "nbr de A : ", a
print "nbr de T : ", t

结果:

nbr of A :  255
nbr of T :  0

即使有T我也总是0

但在那之后,我尝试了这个:

f = open("fst.fasta","r")
a = f.read().count("A")

f = open("fst.fasta","r")
t = f.read().count("T")

print "nbr de A : ", a
print "nbr de T : ", t

这成功了!有没有其他方法可以避免重复 f = open("fst.fasta","r") ?

在第二个 f.read() 之前的

f.seek(0) 会将文件指针重置为文件的开头。或者更明智的是,将 f.read() 的结果保存到一个变量中,然后您可以随心所欲地对该变量调用 .count,而无需毫无意义地重新读取文件。

读入字符串:

f = open ("fst.fasta")
allLines = f.readlines()
f.close()

# At this point, you are no longer using the file handler.

for line in allLines:
  print (line.count("A"), " ", line.count("T"))

每次调用 f.read() 时,它都会消耗文件的全部剩余内容和 returns。然后,您仅使用该数据来计算 as,然后尝试读取已使用的数据。有两种解决方案” 选项 1:使用 f.seek(0)

a = f.read().count("A")
f.seek(0)
t = f.read().count("T")

f.seek 调用将文件的位置设置回开头。

选项2.存储f.read()的结果:

 data = f.read()
 a = data.count("A")
 t = data.count("T")

尝试 with 构造:

with open("fst.fasta","r") as f:
    file_as_string = f.read()
    a = file_as_string.count("A")
    t = file_as_string.count("T")

这会使文件保持打开状态,直到您退出该块。

你正在处理这样一个事实,即 read() 有一个 side effect(非常宽松地使用这个术语):它读取整个文件,并在这样做时设置一个指向它所在位置的指针在那个文件中。当它 returns 时,您可以预期该指针将设置为最后一个位置。因此,从那个位置开始再次执行 read() 并且不会给你任何回报。这就是你想要的:

f = open("fst.fasta","r")
contents = f.read()
a = contents.count("A")
t = contents.count("T")

documentation 还指出了您可以使用的其他方式阅读:

next_value = f.read(1)
if next_value == "":
    # We have reached the end of the file

上面代码中发生的事情是,文件处理程序没有获取文件中的所有字符,而是只返回了 1 个字符。您可以将 1 替换为任何数字,甚至是一个变量来获取文件的特定块。文件处理程序会记住上述指针的位置,您可以从中断的地方继续。 (请注意,这对于非常大的文件来说是一个非常好的主意,因为将其全部读入内存是令人望而却步的。)

只有在您调用 f.close() 后,文件处理程序才会 'forget' 它所在的位置 - 但它也会忘记该文件,您必须再次 open() 它才能开始开始。

还提供了其他函数(例如 seek()readline()),可让您使用不同的语义在文件中移动。 f.tell() 会告诉您当前指针在文件中的位置。