我正在研究一个脚本,用于将文本文件解析为自己的电子表格,为此,我需要通读它们。问题是找出何时停止。 Java在读取时附加了一个名为hasNext()
或hasNextLine()
的方法,我想知道Python中是否有类似的方法?由于某些原因,我在任何地方都找不到。
例如:
open(f) as file:
file.readline()
nextLine = true
while nextLine:
file.readline()
Do stuff
if not file.hasNextLine():
nextLine = false
答案 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
}