使用readline读取限制数量

时间:2016-02-05 13:51:20

标签: python

我正在尝试阅读前100行大文本文件。执行此操作的简单代码如下所示。然而,挑战在于我必须防止没有任何换行符的腐败或其他棘手的文件(是的,人们以某种​​方式找出生成这些的方法)。在那些情况下,我仍然喜欢读取数据(因为我需要查看那里发生了什么),但是将其限制为n个字节。

我能想到的唯一方法是通过char读取char文件。除了速度慢(可能只有100行问题)我担心当遇到使用非ASCII编码的文件时我会遇到麻烦。

是否可以使用readline()限制读取的字节数?或者有更优雅的方式来处理这个?

line_count = 0
with open(filepath, 'r') as f:
    for line in f:
        line_count += 1
        print('{0}: {1}'.format(line_count, line))
        if line_count == 100:
            break

修改

正如@Fredrik正确指出的那样,readline()接受一个限制读取的字符数的arg(我以为它是一个缓冲区大小参数)。因此,就我的目的而言,以下效果非常好:

max_bytes = 1024*1024
bytes_read = 0

fo = open(filepath, "r")
line = fo.readline(max_bytes)
bytes_read += len(line)
line_count = 0
while line != '':
    line_count += 1
    print('{0}: {1}'.format(line_count, line))
    if (line_count == 100) or (bytes_read == max_bytes):
        break
    else:
        line = fo.readline(max_bytes - bytes_read)
        bytes_read += len(line)

2 个答案:

答案 0 :(得分:4)

如果您有文件:

f = open("a.txt", "r")
f.readline(size)

size参数指示要读取的最大字节数

答案 1 :(得分:0)

这将检查没有换行符的数据:

f=open('abc.txt','r')
dodgy=False
if '\n' not in f.read(1024):
    print "Dodgy file - No linefeeds in the first Kb"
    dodgy=True
f.seek(0)
if dodgy==False: #read the first 100 lines
    for x in range(1,101):
        try: line = next(f)
        except Exception as e: break
        print('{0}: {1}'.format(x, line))
else: #read the first n bytes
    line = f.read(1024)
    print('bytes: '+line)
f.close()