Python 临时打开一个文件以将其内容用作输入:是使用语句还是重定向sys.stdin?

Python 临时打开一个文件以将其内容用作输入:是使用语句还是重定向sys.stdin?,python,stdout,stdin,with-statement,sys,Python,Stdout,Stdin,With Statement,Sys,比如说,我想写一个函数,从.txt文件中获取一些基本输入,比如说一些数字,然后我想在另一个.txt文件上打印这些数字乘以2 我被教导我可以导入sys并将sys.stdin和sys.stdout重定向到这些文件,就像这样 import sys def multiply(filein, fileout): global stdin global stdout origin=sys.stdin #saving the original stdin and stdout

比如说,我想写一个函数,从
.txt
文件中获取一些基本输入,比如说一些数字,然后我想在另一个
.txt
文件上打印这些数字乘以2

我被教导我可以导入
sys
并将
sys.stdin
sys.stdout
重定向到这些文件,就像这样

import sys

def multiply(filein, fileout):
    global stdin
    global stdout
    origin=sys.stdin #saving the original stdin and stdout
    origout=sys.stdout
    sys.stdin=open(filein,'r')
    sys.stdout=open(fileout,'w')
    for line in sys.stdin:
        nlist = [float(num) for num in line.split()] #the line is now split and each number is converted to float
        for num in nlist:
            sys.stdout.write((f'{num*2} ')) #each number gets multiplied by 2 and converted back to string
        sys.stdout.write('\n') #just to keep each line divided
        
    sys.stdin.close()
    sys.stdout.close()
    sys.stdin=origin
    sys.stdout=origout
一切正常,但后来我意识到我正在导入一个库,将标准输入和标准输出重定向到正确的文件,只是为了立即将它们重定向回原来的状态

就在那时,我想到了
with
语句。这是完全相同的函数,但我使用的是
with
,而不是整个
stdin
stdout
重定向思想

def multiply(filein, fileout):
   with open(filein,'r') as fin, open(fileout,'w') as fout:
       for line in fin:
           nlist = [float(num) for num in line.split()] 
           for num in nlist:
               fout.write((f'{num*2} '))
           fout.write('\n')
在我看来,它不那么笨重

我想知道为什么我更喜欢第一个版本而不是第二个版本的主要原因是什么(如果有的话)。多谢各位

我想知道为什么我更喜欢第一个版本而不是第二个版本的主要原因是什么(如果有的话)

我想不出有什么


使用
上下文管理器的
可以精确地去除第一个示例中的所有锅炉板代码。此外,如果出现错误,它会释放资源,这是第一个示例所没有的。

第一个版本可用于将信息导入外部脚本(可能的限制)。第二个版本完全是蟒蛇式的。第二个(更简单)在您的演示中更好。第一个版本更通用(扩展功能)。