在Python中读取文件的前N行

我们有一个大的原始数据文件,我们想修剪到一个指定的大小。 我在.net c#中经验丰富,但是想在Python中这样做,以简化事情和出于兴趣。

我将如何去获取Python中的文本文件的前N行? 操作系统是否会影响执行?

谢谢 :)

with open("datafile") as myfile: head = [next(myfile) for x in xrange(N)] print head 

这是另一种方式

 from itertools import islice with open("datafile") as myfile: head = list(islice(myfile, N)) print head 
 N=10 f=open("file") for i in range(N): line=f.next().strip() print line f.close() 

如果你想快速读取第一行,而不关心性能,可以使用.readlines()函数返回列表对象,然后切片列表。

例如前5行:

 with open("pathofmyfileandfileandname") as myfile: firstNlines=myfile.readlines()[0:5] #put here the interval you want 

注意:整个文件是从性能angular度来看并不是最好的,但它使用起来很方便,编写速度快,易于记忆,所以如果你只需要执行一些一次性计算就很方便

 print firstNlines 

没有具体的方法来读取文件对象暴露的行数。

我想最简单的方法如下:

 lines =[] with open(file_name) as f: lines.extend(f.readline() for i in xrange(N)) 

基于gnibbler顶投票答案(09年11月20日在0:27):这个类添加head()和tail()方法文件对象。

 class File(file): def head(self, lines_2find=1): self.seek(0) #Rewind file return [self.next() for x in xrange(lines_2find)] def tail(self, lines_2find=1): self.seek(0, 2) #go to end of file bytes_in_file = self.tell() lines_found, total_bytes_scanned = 0, 0 while (lines_2find+1 > lines_found and bytes_in_file > total_bytes_scanned): byte_block = min(1024, bytes_in_file-total_bytes_scanned) self.seek(-(byte_block+total_bytes_scanned), 2) total_bytes_scanned += byte_block lines_found += self.read(1024).count('\n') self.seek(-total_bytes_scanned, 2) line_list = list(self.readlines()) return line_list[-lines_2find:] 

用法:

 f = File('path/to/file', 'r') f.head(3) f.tail(3) 

从Python 2.6开始,您可以利用IO基类更复杂的function。 所以上面评分最高的答案可以改写为:

  with open("datafile") as myfile: head = myfile.readlines(N) print head 

(因为没有引发StopIterationexception,所以您不必担心文件less于N行。)

如果你想要的东西,显然(没有在手册中查找深奥的东西)工程没有import和尝试/除了和工作在Python 2.x版本(2.2到2.6)的公平范围:

 def headn(file_name, n): """Like *x head -N command""" result = [] nlines = 0 assert n >= 1 for line in open(file_name): result.append(line) nlines += 1 if nlines >= n: break return result if __name__ == "__main__": import sys rval = headn(sys.argv[1], int(sys.argv[2])) print rval print len(rval) 

最自信的方式:

 LINE_COUNT = 3 print [s for (i, s) in enumerate(open('test.txt')) if i < LINE_COUNT] 

基于List Comprehension的解决schemeopen()函数支持迭代接口。 枚举()覆盖open()并返回元组(index,item),然后检查我们是否在可接受的范围内(如果我<LINE_COUNT),然后简单地打印结果。

享受Python。 ;)

对于前5行,只需要:

 N=5 with open("data_file", "r") as file: for i in range(N): print file.next() 

我所做的就是用pandas叫N条线。 我认为performance不是最好的,但是例如如果N=1000

 import pandas as pd yourfile = pd.read('path/to/your/file.csv',nrows=1000) 

如果你有一个非常大的文件,并假设你想要输出是一个numpy数组,使用np.genfromtxt会冻结你的计算机。 根据我的经验,这样好多了:

 def load_big_file(fname,maxrows): '''only works for well-formed text file of space-separated doubles''' rows = [] # unknown number of lines, so use list with open(fname) as f: j=0 for line in f: if j==maxrows: break else: line = [float(s) for s in line.split()] rows.append(np.array(line, dtype = np.double)) j+=1 return np.vstack(rows) # convert list of vectors to array 
 #!/usr/bin/python import subprocess p = subprocess.Popen(["tail", "-n 3", "passlist"], stdout=subprocess.PIPE) output, err = p.communicate() print output 

这个方法为我工作