代码之家  ›  专栏  ›  技术社区  ›  Jay

Python的fileinput如何接受输入

  •  0
  • Jay  · 技术社区  · 7 年前

    fileinput.input() 接受交互式输入。

    我看了一下上面的代码- https://github.com/python/cpython/blob/master/Lib/fileinput.py

    这就是内线阅读器的外观:

    def _readline(self):
        if not self._files:
            if 'b' in self._mode:
                return b''
            else:
                return ''
        self._filename = self._files[0]
        self._files = self._files[1:]
        self._startlineno = self.lineno()
        self._filelineno = 0
        self._file = None
        self._isstdin = False
        self._backupfilename = 0
        if self._filename == '-':
            self._filename = '<stdin>'
            if 'b' in self._mode:
                self._file = getattr(sys.stdin, 'buffer', sys.stdin)
            else:
                self._file = sys.stdin
            self._isstdin = True
        else:
            if self._inplace:
                self._backupfilename = (
                    os.fspath(self._filename) + (self._backup or ".bak"))
                try:
                    os.unlink(self._backupfilename)
                except OSError:
                    pass
                # The next few lines may raise OSError
                os.rename(self._filename, self._backupfilename)
                self._file = open(self._backupfilename, self._mode)
                try:
                    perm = os.fstat(self._file.fileno()).st_mode
                except OSError:
                    self._output = open(self._filename, "w")
                else:
                    mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
                    if hasattr(os, 'O_BINARY'):
                        mode |= os.O_BINARY
    
                    fd = os.open(self._filename, mode, perm)
                    self._output = os.fdopen(fd, "w")
                    try:
                        if hasattr(os, 'chmod'):
                            os.chmod(self._filename, perm)
                    except OSError:
                        pass
                self._savestdout = sys.stdout
                sys.stdout = self._output
            else:
                # This may raise OSError
                if self._openhook:
                    self._file = self._openhook(self._filename, self._mode)
                else:
                    self._file = open(self._filename, self._mode)
        self._readline = self._file.readline  # hide FileInput._readline
        return self._readline()
    

    我不知道该怎么做,我很想知道这里的交互输入实际上是如何处理的,因为我没有看到对内置的调用 input() .

    实际上是什么在中生成了用户提示 文件输入。输入() ?

    0 回复  |  直到 7 年前
        1
  •  1
  •   user459872    7 年前

    它会召唤 sys.stdin.readline 方法,但不提供任何参数。当没有提供参数时 _readline 方法是这样的。

    def _readline(self):
            if self._filename == '-': # when no `files` parameter is supplied `self._filename` will be `-`
                    self._file = sys.stdin
            self._readline = self._file.readline  # hide FileInput._readline
            return self._readline() # invoke the sys.stdin.readline()