readline函数返回空字符串

2024-10-01 11:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python是新手,在C++编程方面经验很少。我看到了this问题,但它没有解决我的问题。在

Python 2.7.9, 64-bit AMD, Windows 7 Ultimate, NTFS, administrator privileges & no "read only" attribute on file to be read.

我想创建一个满足特定条件的字符串列表,这些字符串是文件的行(请参见记事本.cc/diniko93)。所以我写了以下函数-

def makeLineList( filePtr, ptr ):
    lines = []
    while True:
        s = filePtr.readline()
        if not s=="":
            s = s[3:]
            s = s.split()
            if s[0].isdigit():
                print("O")
                lines.append(s)
            elif s[0] in {"+", "-"}:
                print("U")
                lines.append(s)
        else:
            print("none")
            break
    filePtr.seek(ptr, 0);    #I did this to restore file pointer, so other functions accessing this file later don't misbehave
    return lines

我使用的两个可能的main()类(请原谅我对python一无所知)实体是-

^{pr2}$

另一个-

osrc = open("./testStage1.txt", 'r')
osrc.seek(291, 0)
L = makeLineList( osrc, osrc.tell())
print "".join(L)
osrc.close()

两次终端上的输出都是令人失望的none

请注意以上代码是重现问题所需的最低要求,而不是整个代码。在

编辑: 根据@avenet的建议,我在google上尝试在代码中使用iter(__next__obj.next()在python3.3+中使用next(obj)),但问题仍然存在,即使我从函数内部调用next(osrc),我也无法读取下一行代码检查这两个片段

  • version2next只在main()中使用-不调用ish part transform_line函数。调用next()3次会产生理想的/预期的输出,但是
  • version3我得到了一个列表索引超出范围的错误,即使列表[0]确实有一个数字

编辑2:我尝试在函数中使用scope check作为if not osrc in locals():在下一行中使用适当的缩进print("osrc not reachable")。输出是osrc not reachable。我还尝试使用临时tLib.py公司但结果是一样的。为什么osrc在这两种情况下都不可用?在

编辑3:因为问题似乎在范围之内。 因此,为了避免传递文件变量-创建一个唯一的目的是读取一行的函数。是否下一行的决定取决于isLineUtility()等函数的返回值

def isLineUseful( text, lookFor ):
    if text.find(lookFor)!=-1:
        return 1
    else:
        return 0
def makeList( pos, lookFor ):
    lines = []
    with open("./testStage1.txt", 'r') as src:
        src.seek(pos)
        print(src.read(1))
        while True:
            line = next(src)
            again = isLineUseful(line, lookFor)
            if again==0:
                src.seek(pos)
                break
            else:
                lines.append(line)
    return lines

t = makeList(84, "+")
print "\n".join(t)

试过了,在这个上面效果很好(记事本.cc/diniko93)示例testStage1.txt。在

因此,我的编程问题得到了解决(感谢responders:D)&;我将此标记为已回答,但发布了一个关于readline()&;__next__的异常/行为的新问题。在

另外,我还在学习python的方法,所以如果您能推荐一个更适合我上面代码的pythonicidomatic版本,我将非常高兴。在


Tags: 函数代码srcreadreturniflinenot
3条回答

您尝试处理此输入:

<P> unnecessart line </P>
<P> Following is an example of list </P>
<P> 1. abc </P>
<P>     + cba </P>
<P>     + cba </P>
<P>             + xyz </P>

现在在你的大脑里,你只看到重要的部分,而Python看到了所有的东西。对于Python(和任何其他编程语言),每行都以<开头。这就是if永远不匹配的原因。在

如果删除了<P>,请确保也删除了空格,因为

^{pr2}$

第二行以空格开头,因此s[0]不是{}。要去除空格,请使用s.trim()。在

如果要按自己的方式修改线条:

def transform_line(line):
    if line != "":
        if line[0].isdigit():
            print("O")
        elif line[0] in {"+", "-"}:
            print("U")
    else:
        print("None")
    return line

with open("./testStage1.txt", 'r') as osrc:
    osrc.seek(291)
    lines = [transform_line(line) for line in osrc]
    #Do whatever you need with your line list

如果不想变换线条,请执行以下操作:

^{pr2}$

或者,如果需要在特定条件下停止,则只需实现一个行迭代器:

def line_iterator(file):
    for line in file:
        if not line[0].isdigit() and not line in ["+", "-"]:
            yield line
        else:
            break

with open("./testStage1.txt", 'r') as osrc:
    osrc.seek(291)
    lines = list(line_iterator(osrc))
    #To skip lines from the list containing 'blah'
    lines = [x for x in lines if 'blah' not in line]
    #Do whatever you need with your line list

首先,您并没有使用Python。使用Python这样的语言的目的是编写更少的代码行,以实现其他编程语言中的其他代码片段的相同结果,例如C++或java。在

不需要将文件指针作为函数参数传递来读取文件,您可以在传递文件名的函数中直接打开文件。在

然后可以用文件名调用这个函数,并将列表存储在一个最终将要操作的变量中。如果您不熟悉异常处理,可以使用模块os中的一个函数来检查文件是否已经存在:os.path.exists(filename)。在

如果要在当前使用的行中搜索模式,只需使用If语句即可(有很多方法可以这样做,这只是一个示例):

if line not in list_of_strings_you_want_not_to_include: 
    lines.append(line)

如果要检查模式是否在开头,可以使用startswith字符串函数:

^{pr2}$

如果您想跳过一定数量的字符,可以使用seek函数(正如您实际使用的那样)。这只是一种使用更多代码行的方法,但仍然非常简单:

def read_file(filename, _from):
    lines = []
    try:
        with open(filename) as file:
            file.seek(_from)
            for line in file:
                lines.append(line)     
    except FileNotFoundError:
        print('file not found')
    return lines

filename = "file.txt"
lines = read_file(filename, 10)

更简单的是,您也可以这样做,而不是显式地遍历所有行:

with open(filename) as file:
    file.seek(_from)
    return list(file)

或者使用您最喜欢的函数readlines

with open(filename) as file:
    file.seek(_from)
    return file.readlines()

显式迭代所有行的目的和好处是,您可以在阅读的正确时刻对行或字符进行大量检查和任何需要的检查,所以我肯定会采用上面建议的第一个选项。在

相关问题 更多 >