微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

临时打开文件以使用其内容作为输入:with-statement 还是重定向 sys.stdin?

如何解决临时打开文件以使用其内容作为输入:with-statement 还是重定向 sys.stdin?

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

我被教导我可以导入 sys 并将 sys.stdinsys.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 而不是整个 stdinstdout 重定向想法。

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')

在我看来,它看起来不那么笨重。

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

解决方法

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

我想不出任何。

with 上下文管理器正是为了摆脱第一个示例中的所有样板代码。另外,如果出现错误,它会释放资源,这是第一个示例所没有的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?