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