关于python的两个简单问题

时间:2009-05-30 15:05:14

标签: python file

我有两个关于python的简单问题:

1.如何在python中获取文件的行数?

2.如何将文件对象中的位置定位到 最后一行很容易?

9 个答案:

答案 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]

返回列表的最后一个元素