检查文本文件是否有另一行Python

时间:2018-08-21 18:11:33

标签: python

我正在研究一个脚本,用于将文本文件解析为自己的电子表格,为此,我需要通读它们。问题是找出何时停止。 Java在读取时附加了一个名为hasNext()hasNextLine()的方法,我想知道Python中是否有类似的方法?由于某些原因,我在任何地方都找不到。

例如:

open(f) as file:
    file.readline()
    nextLine = true
    while nextLine:
        file.readline()
        Do stuff
        if not file.hasNextLine():
            nextLine = false

5 个答案:

答案 0 :(得分:4)

只需使用for循环即可遍历文件对象:

for line in file:
    #do stuff..

请注意,这包括在每个\n字符串末尾的换行符(line)。可以通过以下任一方法将其删除:

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

或:

for line in (l[:-1] for l in file):
    #do stuff...

您只能通过读取文件来检查文件是否还有另一行(尽管您可以使用file.tell检查文件是否位于文件的末尾)。

这可以通过调用file.readline并检查字符串是否不为空,或者通过timgeb's method调用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

这将重置文件指针,从而将文件对象重置回其原始状态。

例如

$ printf "hello\nthere\nwhat\nis\nup\n" > f.txt
$ python -q
>>> f = open('f.txt')
>>> def has_another_line(file):
...     cur_pos = file.tell()
...     does_it = bool(file.readline())
...     file.seek(cur_pos)
...     return does_it
... 
>>> has_another_line(f)
True
>>> f.readline()
'hello\n'

答案 1 :(得分:2)

我用于读取文本文件的典型节奏是:

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

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

答案 2 :(得分:1)

文件是行上的迭代器。如果您要做的只是检查文件是否还剩一行,则可以发出line = next(file)并捕获引起的StopIeration,以防没有另一行。或者,您可以将line = next(file, default)与非字符串default值一起使用(例如None),然后进行检查。

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

答案 3 :(得分:1)

with open(filepath, 'rt+') as f:
    for line in f.readlines():
        #code to process each line

以这种方式打开它还会在完成时将其关闭,这在整体内存使用方面要好得多,这可能并不重要,具体取决于文件大小。

第一行类似于:

f = open(....)

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

循环将在第一行开始,然后在最后一行结束,并且例如,不应引发任何与EOF有关的错误。

[编辑]

请注意open方法中的“ rt +”。据我所知,这会以读取文本模式打开文件。即无需解码。

答案 4 :(得分:1)

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

public String retrieveJson() {
   publicationRecords = service.getPublicationRecords();
   return SUCCESS;
}

但是正如其他人指出的那样,将文件视为可迭代文件可能会做得更好,例如:

{
  "publicationRecords" : ..,
  "reviewRecords" : null,
  "customRecords" : null
}