将行写入python文件

将行写入python文件,python,Python,我有一个非常简单的python脚本,它运行一个用户定义函数(hetero),将序列(文本字符串)连接到非常大的文件上,一次两个序列(行)。无论如何,正如我写的,它会打印到屏幕上,但我想把所有输出都写到一个文件中 f = open ("new", "r") while True: line1 = f.readline() line1a = line1.split() line2 = f.readline() line2a =line2.split() if

我有一个非常简单的python脚本,它运行一个用户定义函数(hetero),将序列(文本字符串)连接到非常大的文件上,一次两个序列(行)。无论如何,正如我写的,它会打印到屏幕上,但我想把所有输出都写到一个文件中

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
这只是将脚本的结果打印到终端。因此,我尝试将结果(从print命令“line1a[1]+..”)写入另一个打开以供写入的文件(附加到脚本末尾):

但这当然行不通。但我不明白为什么…我需要打开文件与文件一起写入以便读取,这样它就在While循环之外了吗?需要技巧的是,脚本在整个文件中一次读取两行,每次在一行中打印ID信息和序列——我想将所有这些结果打印到一个文件中


我确信这是一个简单的修复,但我并不经常使用python,而且总是发现文件系统I/o很难处理

每次打开要写入的文件时,它都会被截断。如果要追加,可以在开始时将其打开并保持打开状态,或者改为在追加模式下打开(
a
而不是
w

此外,您还应使用
with
语句:

with open('new', 'r') as f, open('out.txt', 'w') as out:
    while True:
        ... 
这将在块结束后为您自动调用
close

您还可以清理“读取一对行并拆分它们”代码。而不是
,而为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
,否则它会立即将整个文件读入内存

每次打开要写入的文件时,它都会被截断。如果要追加,可以在开始时将其打开并保持打开状态,或者改为在追加模式下打开(
a
而不是
w

此外,您还应使用
with
语句:

with open('new', 'r') as f, open('out.txt', 'w') as out:
    while True:
        ... 
这将在块结束后为您自动调用
close

您还可以清理“读取一对行并拆分它们”代码。而不是
,而为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
,否则它会立即将整个文件读入内存

您正在使用此代码

out_file = open ("out.txt", "w")
out_file.write(line1a[1]+"_"+line1a[0],tri)
out_file.close()
out_file = open ("out.txt", "w")
[while ...]
out_file.close()
在每次迭代中。注意“w”标志:这意味着您将在每次迭代时再次打开文件,并从一开始就覆盖它。如果您想附加到它,可以使用标志“a”

但还有更多:这个代码

out_file = open ("out.txt", "w")
out_file.write(line1a[1]+"_"+line1a[0],tri)
out_file.close()
out_file = open ("out.txt", "w")
[while ...]
out_file.close()

应该在
while
循环之外,因为您只需要打开和关闭此文件一次。

您正在使用此代码

out_file = open ("out.txt", "w")
out_file.write(line1a[1]+"_"+line1a[0],tri)
out_file.close()
out_file = open ("out.txt", "w")
[while ...]
out_file.close()
在每次迭代中。注意“w”标志:这意味着您将在每次迭代时再次打开文件,并从一开始就覆盖它。如果您想附加到它,可以使用标志“a”

但还有更多:这个代码

out_file = open ("out.txt", "w")
out_file.write(line1a[1]+"_"+line1a[0],tri)
out_file.close()
out_file = open ("out.txt", "w")
[while ...]
out_file.close()

应该在
while
循环之外,因为您只需要打开和关闭此文件一次。

不确定您将
文件放在哪里
代码,但您可能将其放在循环中,并且每次都会打开和关闭。试试像这样的东西

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)

编辑你会注意到我使用上下文打开了文件,我很喜欢这样,因为你不必担心以后关闭它,而且我似乎更清楚文件打开了多长时间

不确定你把你的
文件放在哪里
代码,但你可能会把它放在循环中,每次都会打开和关闭。试试像这样的东西

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)

编辑您会注意到我是使用上下文打开文件的,我非常喜欢这样做,因为您不必担心以后关闭它,而且我似乎更清楚文件打开的时间

如果您像以下方式打开文件,则只能在循环中打开文件:

out_file = open ("out.txt", "a")
注意“a”表示追加模式

如果使用“w”打开它,它将在循环的每次迭代中被覆盖


您可以检查此项以了解更多信息。

只有在如下方式打开文件时,才能在循环中打开该文件:

out_file = open ("out.txt", "a")
注意“a”表示追加模式

如果使用“w”打开它,它将在循环的每次迭代中被覆盖


如果您不喜欢python文件I/O
,可以查看此项以了解更多信息。

:(
,您还可以使用shell将控制台输出重定向到一个文件。而不是
python my_program.py
执行
python my_program.py>out.txt
。这样您就可以保持打印语句不变。在循环之前打开输出文件,在循环中写入,在循环之后关闭如果您不喜欢python文件I/O
:(
,您还可以使用shell将控制台输出重定向到文件。而不是
python my_program.py
执行
python my_program.py>out.txt
。这样您就可以保持打印语句的原样。在循环之前打开输出文件,在循环中写入,在循环之后关闭