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