将python中读者的输入读入字符串

时间:2014-02-12 13:48:53

标签: python python-2.7 readline sys

我在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()”中。我不确定我做错了什么,任何帮助都会非常感激。谢谢

5 个答案:

答案 0 :(得分:1)

在阅读之前需要先打开文件,例如:

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

^另外,尽量不要使用像“str”

这样的保留关键字

答案 1 :(得分:1)

我建议你重建你的程序:

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)

答案 2 :(得分:0)

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

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

的try /除

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

还有其他方法。如果是这种情况,记录函数本身需要IO object

答案 3 :(得分:0)

您正在处理类似文件对象(或任何具有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方法。

答案 4 :(得分:0)

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

如果没有这个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.