防止在 Python 中关闭文件
Prevent closing file in Python
我在从文件中读取字符时遇到问题。我有一个名为 fst.fasta
的文件,我想知道字母 A
和 T
.
出现的次数
这是第一个代码示例:
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。然后,您仅使用该数据来计算 a
s,然后尝试读取已使用的数据。有两种解决方案”
选项 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()
会告诉您当前指针在文件中的位置。
我在从文件中读取字符时遇到问题。我有一个名为 fst.fasta
的文件,我想知道字母 A
和 T
.
这是第一个代码示例:
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。然后,您仅使用该数据来计算 a
s,然后尝试读取已使用的数据。有两种解决方案”
选项 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()
会告诉您当前指针在文件中的位置。