【问题标题】:Reading input from reader in python into string将python中阅读器的输入读入字符串
【发布时间】:2014-03-10 21:19:22
【问题描述】:

我在 Python 中有一个函数,它接收一个“阅读器”(我希望这是正确的术语)。基本上该函数应该能够使用文件、sys.stdin 等。然后它必须读取所有行并将它们存储到一个字符串中。

目前我的函数调用看起来像:

   read_data (sys.stdin, sys.stdout)

   read_data ("file.txt", "fileout.txt")

函数本身看起来像:

def read_data (reader, s) :

   str = ""

   str = r.readline()
   line = str
   while line != "" and line != None and line != '\n':
       line = r.readline()
       str = str + line

当我运行代码并将输入粘贴到控制台进行测试时,它实际上能够读取包括最后一行在内的所有行,但之后它卡在“line = readline()”中。我不确定我做错了什么,任何帮助将不胜感激。谢谢你

【问题讨论】:

  • FWIW 我认为您正在寻找的术语是IO 对象。 Duck-wise,你基本上是在寻找任何实现readline的对象
  • 如果您使用的是 Windows,您可能需要添加 and line != '\r\n'。为了简单起见,您可能需要将 if 改写为 if not line in ["", ...]:
  • @LaurIvan 我建议将文件结尾的检测留给操作系统,即。到 python 库。当遇到空行时,上述解决方案也会停止读取输入文件,即。不在EOF。猜猜这是否是 OP 的意图。

标签: python python-2.7 readline sys


【解决方案1】:

读取前需要先打开文件,例如:

f = open(reader, "r")
text = f.readline()

^ 另外,尽量不要使用“str”等保留关键字

【讨论】:

  • 部分问题是有时 fd 已经打开。
  • 感谢有关 str 的提示(我实际上使用的是 s,只是将 str 放在问题中)。是的,问题出现了,因为我也用 sys.stdin 调用了该函数。
【解决方案2】:

我建议您像这样重组您的程序:

def read_data(in_stream=sys.stdin, out_stream=sys.stdout):
    """
    in_srteam: stream open for reading (defaults to stdin)
    out_stream: stream open for writing (defaults to stdout)
    """

    s = ''.join([line for line in in_stream])
    out_stream.write(s)

【讨论】:

  • ''.join([line for line in in_stream])''.join(in_stream.readlines()) 不同吗? (据我所知,所有实现readline 的对象也实现了readlines。)
  • @kojiro: ''.join(in_stream.readlines()) 基本上是 in_stream.read()。有了理解,我可以去掉换行符或对这些行做一些事情。
【解决方案3】:

在一种情况下,您传递了一个打开的文件描述符sys.stdin。在另一个中,您正在传递一个字符串。后者与您拥有readline 方法的界面不匹配。您可以通过以下几种方法之一来解决此问题。测试对象是否有readline方法:

if not hasattr(reader, "readline"): # and is callable, etc, etc
    reader = open(reader, 'r')

尝试/排除

try:
    result = reader.readline()
except AttributeError:
    with open(reader,'r') as realreader:
        result = realreader.readline()

还有其他方法。您应该证明函数本身需要IO object,如果是这样的话。

【讨论】:

    【解决方案4】:

    您将字符串视为文件对象(或任何具有readline 方法的对象)。如果您希望能够同时传递字符串和文件对象,那么您可以先测试一下参数是否为字符串。

    def read_data (reader, s) :
       if isinstance(reader,str):
           reader = open(reader,"r")   
       if isinstance(s,str):
           s = open(s,"w+")
    
       str = "" #avoid using str for a variable name
    
       str = r.readline()
       line = str
       while line != "" and line != None and line != '\n':
           line = r.readline()
           str = str + line
    

    您还可以使用hasattr 来测试传递的对象是否具有readline 方法,然后再选择是否尝试将其作为文件打开。

    【讨论】:

      【解决方案5】:

      如果我正确理解了您的问题,您需要将 EndOfFile 放入流中。对于 Unix/Linux 中的交互式输入,请使用 Ctrl-d(即 ^d),在 Windows 中使用 Ctrl-z

      没有这个readline 不会像你期望的那样返回一个空字符串。

      readline(...)
          readline([size]) -> next line from the file, as a string.
      
          Retain newline.  A non-negative size argument limits the maximum
          number of bytes to return (an incomplete line may be returned then).
          Return an empty string at EOF.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 2014-03-26
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多