我在python中有一个非常简单的脚本,它运行一个用户定义的函数(异类),它将序列(文本字符串)连接在一起非常大的文件,2个序列(行)。无论如何,正如我所写,它打印到屏幕上,但我想将所有输出写入单个文件。
f = open ("new", "r")
while True:
line1 = f.readline()
line1a = line1.split()
line2 = f.readline()
line2a =line2.split()
if not line2: break
tri="".join ([hetero(b1, b2) for (b1, b2) in zip(line1a[2], line2a[2])])
print line1a[1]+"_"+line1a[0],tri
这只是向终端打印脚本的结果。所以我试着把结果(从打印命令“line1a [1] + .....”)写到另一个打开写入的文件(附加到脚本的末尾):
out_file = open ("out.txt", "w")
out_file.write(line1a[1]+"_"+line1a[0],tri)
out_file.close()
但当然它不起作用。我不明白为什么虽然......我是否需要打开文件一起写入文件进行读取,以便它的外部循环?棘手的是脚本在整个文件中一次读取两行,并且每次都将ID信息和序列打印在一行中 - 我想将所有这些结果打印到单个文件中。
这是一个简单的修复我确定,但我不经常使用python,并且总是发现文件系统i / o很难处理。
答案 0 :(得分:3)
每次打开文件进行写入都会被截断。如果您想要追加,可以在开头打开它并保持打开状态,或者改为以追加模式打开(a
而不是w
)。
此外,您应该使用with
声明:
with open('new', 'r') as f, open('out.txt', 'w') as out:
while True:
...
这将在块结束后自动为您调用close
。
你也可以清理你的"读一对线并将它们分开"码。而不是while True:
from itertools import izip
pairs = ((l1.split(), l2.split()) for l1, l2 in izip(f, f))
for line1a, line2a in pairs:
tri = ...
请注意,您要使用izip
代替zip
,或者只是立即将整个文件读入内存。
答案 1 :(得分:1)
不确定您放置out_file
代码的位置,但您可能会将其置于循环中并且每次传递都会打开和关闭。尝试像
with open('out.txt', 'w') as outfile, open("new", "r") as f:
while True:
line1 = f.readline()
line1a = line1.split()
line2 = f.readline()
line2a =line2.split()
if not line2: break
tri="".join ([hetero(b1, b2) for (b1, b2) in zip(line1a[2], line2a[2])])
#print line1a[1]+"_"+line1a[0],tri
out_file.write(line1a[1]+"_"+line1a[0],tri)
编辑您会注意到我使用上下文打开了文件,我很喜欢这个,因为您不必担心以后关闭它,对我来说似乎更清楚文件打开多长时间
答案 2 :(得分:0)
您正在使用此代码
out_file = open ("out.txt", "w")
out_file.write(line1a[1]+"_"+line1a[0],tri)
out_file.close()
每次迭代。注意' w' flag:这意味着您在每次迭代时再次打开文件并从start开始覆盖它。如果您想要附加到它,您可以使用标记' a'。
但还有更多:此代码
out_file = open ("out.txt", "w")
[while ...]
out_file.close()
应该在while
循环之外,因为您只需要打开和关闭此文件一次。
答案 3 :(得分:0)
如果你打开它,你只能打开循环内的文件:
out_file = open ("out.txt", "a")
注意附加模式的“a”。
如果使用“w”打开它,它将在循环的每次迭代时被覆盖。
您可以查看此Python files reference以了解详情。