我有两个关于python的简单问题:
1.如何在python中获取文件的行数?
2.如何将文件对象中的位置定位到 最后一行很容易?
答案 0 :(得分:8)
行只是换行符'\n'
分隔的数据。
1)由于行是可变长度的,你必须读取整个文件才能知道换行符的位置,这样你就可以计算出多少行:
count = 0
for line in open('myfile'):
count += 1
print count, line # it will be the last line
2)从文件末尾读取一个块是查找最后一个换行符的最快方法。
def seek_newline_backwards(file_obj, eol_char='\n', buffer_size=200):
if not file_obj.tell(): return # already in beginning of file
# All lines end with \n, including the last one, so assuming we are just
# after one end of line char
file_obj.seek(-1, os.SEEK_CUR)
while file_obj.tell():
ammount = min(buffer_size, file_obj.tell())
file_obj.seek(-ammount, os.SEEK_CUR)
data = file_obj.read(ammount)
eol_pos = data.rfind(eol_char)
if eol_pos != -1:
file_obj.seek(eol_pos - len(data) + 1, os.SEEK_CUR)
break
file_obj.seek(-len(data), os.SEEK_CUR)
你可以这样使用:
f = open('some_file.txt')
f.seek(0, os.SEEK_END)
seek_newline_backwards(f)
print f.tell(), repr(f.readline())
答案 1 :(得分:7)
我们不要忘记
f = open("myfile.txt")
lines = f.readlines()
numlines = len(lines)
lastline = lines[-1]
注意:这会将整个文件作为列表读取到内存中。在文件非常大的情况下请记住这一点。
答案 2 :(得分:5)
最简单的方法就是将文件读入内存。例如:
f = open('filename.txt')
lines = f.readlines()
num_lines = len(lines)
last_line = lines[-1]
但是对于大文件,这可能会消耗大量内存,因为整个文件都会加载到RAM中。另一种方法是逐行遍历文件。例如:
f = open('filename.txt')
num_lines = sum(1 for line in f)
这样效率更高,因为它不会将整个文件加载到内存中,而只能一次查看一行。如果你想要最后一行,你可以在迭代时跟踪这些行并得到两个答案:
f = open('filename.txt')
count=0
last_line = None
for line in f:
num_lines += 1
last_line = line
print "There were %d lines. The last was: %s" % (num_lines, last_line)
如果您只需要最后一行,最后一个可能的改进是从文件末尾开始,然后向后搜索,直到找到换行符。 Here's一个有一些代码执行此操作的问题。如果你同时需要两个行数,那么除了迭代文件中的所有行之外别无选择。
答案 3 :(得分:2)
对于适合内存的小文件,
如何使用str.count()
获取文件的行数:
line_count = open("myfile.txt").read().count('\n')
答案 4 :(得分:2)
我也想添加其他解决方案,其中一些(寻找\n
的人)将无法使用具有OS 9样式行结尾的文件(仅\r
),并且他们可能在最后包含一个额外的空白行,因为许多文本编辑因某些奇怪的原因附加了它,所以你可能想也可能不想为它添加一个检查。
答案 5 :(得分:1)
计算[我知道]行的唯一方法是读取所有行,如下所示:
count = 0
for line in open("file.txt"): count = count + 1
循环后,count
将读取行数。
答案 6 :(得分:0)
回答第一个问题(当使用此方法时要注意大文件的性能不佳):
f = open("myfile.txt").readlines()
print len(f) - 1
回答第二个问题:
f = open("myfile.txt").read()
print f.rfind("\n")
P.S。是的我明白这只适合小文件和简单程序。我想我不会删除这个答案,但对于它看起来真实的用例却毫无用处。
答案 7 :(得分:0)
对于第一个问题,已经有一些好的,我会建议@Brian的一个是最好的(最pythonic,行结束字符证明和内存效率):
f = open('filename.txt')
num_lines = sum(1 for line in f)
对于第二个,我喜欢@nosklo的一个,但修改为更一般应该是:
import os
f = open('myfile')
to = f.seek(0, os.SEEK_END)
found = -1
while found == -1 and to > 0:
fro = max(0, to-1024)
f.seek(fro)
chunk = f.read(to-fro)
found = chunk.rfind("\n")
to -= 1024
if found != -1:
found += fro
它从文件末尾以1Kb的块搜索,直到找到换行符或文件结束。在代码的末尾,找到了最后一个换行符的索引。
答案 8 :(得分:0)
正确答案为:
x = open("file.txt")
打开文件或我们有x与file.txt相关联
y = x.readlines()
返回列表中的所有行
length = len(y)
将列表长度返回到长度
或在一行
length = len(open("file.txt").readlines())
答案2:
last = y[-1]
返回列表的最后一个元素