Python 检查文本文件是否有其他行

Python 检查文本文件是否有其他行,python,Python,我正在为自己编写一个脚本,将文本文件解析成电子表格,在这样做的过程中,我需要通读它们。问题在于找出何时停止。Java在阅读时附加了一个名为hasNext()或hasNextLine()的方法,我想知道Python中是否有类似的方法?不知什么原因,我到处都找不到这个 例: 只需使用for循环迭代文件对象: for line in file: #do stuff.. 请注意,这包括每个行字符串末尾的新行字符(\n)。这可以通过以下任一方式删除: for line in file:

我正在为自己编写一个脚本,将文本文件解析成电子表格,在这样做的过程中,我需要通读它们。问题在于找出何时停止。Java在阅读时附加了一个名为
hasNext()
hasNextLine()
的方法,我想知道Python中是否有类似的方法?不知什么原因,我到处都找不到这个

例:


只需使用for循环迭代文件对象:

for line in file:
    #do stuff..
请注意,这包括每个
字符串末尾的新行字符(
\n
)。这可以通过以下任一方式删除:

for line in file:
    line = line[:-1]
    #do stuff...
或:


您只能通过读取该文件来检查该文件是否有另一行(尽管您可以通过
file.tell
检查您是否在文件末尾,而不进行任何读取)

这可以通过调用
file.readline
并检查字符串是否为空,或者调用
next
并捕获
StopIteration
异常来实现

为了准确回答您的问题,您可以检查文件是否有另一行:

next_line = file.readline():
if next_line:
    #has next line, do whatever...
或者,在不修改当前文件指针的情况下:

def has_another_line(file):
    cur_pos = file.tell()
    does_it = bool(file.readline())
    file.seek(cur_pos)
    return does_it
这将重置文件指针,并将文件对象重置回其原始状态

e、 g


我用于阅读文本文件的典型节奏如下:

with open('myfile.txt', 'r') as myfile:

    lines = myfile.readlines()

for line in lines:

    if 'this' in line: #Your criteria here to skip lines
        continue

    #Do something here

一起使用只会使文件保持打开状态,直到您执行了其块中的所有代码,然后文件才会关闭。我还认为在此突出显示
readlines()
方法很有价值,该方法读取文件中的所有行并将它们存储在列表中。关于处理换行符(
\n
)字符,我想让您看看@Joe Iddon的答案。

文件是行上的迭代器。如果您只想检查一个文件是否还有一行,您可以发出
line=next(file)
并捕获在没有其他行的情况下引发的
stopiration
。或者,您可以将
line=next(file,default)
与非字符串
default
值(例如
None
)一起使用,然后对照该值进行检查

请注意,在大多数情况下,正如其他答案所解释的,当文件上的
for
循环结束时,您就知道完成了。因此,请确保您确实需要使用
next
进行这种细粒度控制

with open(filepath, 'rt+') as f:
    for line in f.readlines():
        #code to process each line
以这种方式打开它也会在它完成时关闭它,这对总体内存使用来说要好得多,这可能与文件大小无关

第一行与以下内容相当:

f=open(..)

f.readlines()
提供文件中所有行的列表

循环将从第一行开始,然后在最后一行结束,并且不应该抛出任何关于EOF的错误

[编辑]


注意open方法中的“rt+”。据我所知,这将以读取文本模式打开文件。也就是说,不需要解码。

Python没有文件结束(EOF)指示器,但您可以通过以下方式获得相同的效果:

with open(f) as file:
    file.seek(0, 2)      # go to end of file
    eof = file.tell()    # get end-of-file position
    file.seek(0, 0)      # go back to start of file
    file.readline()
    nextLine = True      # maybe nextLine = (file.tell() != eof)
    while nextLine:
        file.readline()
        # Do stuff
        if file.tell() == eof:
            nextLine = False
但正如其他人所指出的,将文件视为一个iterable可能会做得更好,如下所示:

with open(f) as file:
    next_line = next(file)
    # next loop will terminate when next_line is '', 
    # i.e., after failing to read another line at end of file
    while next_line:
        # Do stuff
        next_line = next(file)

或者您可以只使用
line.strip()
@rahlf23,这在某些情况下不会删除
'\n'
。不幸的是,我不能这样做,因为不同的行会去不同的地方,或者由于它们的内容而被跳过,每个循环需要处理大约40行,它只是被分割到一个点,我不知道每个文件有多少节,每个节包含什么,你是对的@timgeb,我只是假设用户不会关心删除前导和尾随空格characters@yourknightmares为什么在得到正确答案后,你会把问题的要求改成没人能预料到的要求?这通常会让回答者不屑一顾,将来也帮不了你。如果你有一个新问题,问一个新问题。我想我们在回答这个问题的同时,你将所有行存储在一个变量中,从而使带有open的
变得几乎毫无意义,不是吗?这就是我们答案的不同之处:)它会产生相同的开销,所以不会。我相信这更容易阅读,尤其是当你想
枚举(行)
并引用
列表中的特定索引时。最后使用if语句并检查其中是否有新行,由于能够读取python中不存在的行,因此它们只能显示为空stringsTry
print(repr(line))
噢,我完全误解了@Swift的意思,这是我的错。你是对的,我会更新。考虑文件指针在最后一行中途的一个字节的情况:这个方法会说“是”,“我有另一行吗?”而你真的没有。不可避免的是,您必须一直读到下一个换行符(
\n
),以确定是否还有另一行。您唯一能做的另一件事是重置文件指针,使您至少处于与选中之前相同的状态:/@JoeIddon,我假设代码使用的是
readline
next()
(如图所示),在这种情况下,它将永远不会中途停止。但是,即使代码逐字节读取,并且当前位于中间行,下一个
readline
将返回当前行的其余部分。更相关的情况是,剩下的文本没有完整的一行,即结尾没有换行符。然后我的测试将返回
True
readline
next()
仍将读取剩余文本,即使没有终止换行符。在这种情况下,Java的
hasNextLine()
会返回False吗?我不知道Java中的这种特殊情况。你的代码不能正常工作(
false
!=
不正确),但我喜欢它的逻辑。@JoeIddon你是对的。我想到了“hasNextLine”的概念,它相当于
file.tell()=
with open(filepath, 'rt+') as f:
    for line in f.readlines():
        #code to process each line
with open(f) as file:
    file.seek(0, 2)      # go to end of file
    eof = file.tell()    # get end-of-file position
    file.seek(0, 0)      # go back to start of file
    file.readline()
    nextLine = True      # maybe nextLine = (file.tell() != eof)
    while nextLine:
        file.readline()
        # Do stuff
        if file.tell() == eof:
            nextLine = False
with open(f) as file:
    next_line = next(file)
    # next loop will terminate when next_line is '', 
    # i.e., after failing to read another line at end of file
    while next_line:
        # Do stuff
        next_line = next(file)