我是靠谱客的博主 紧张小懒虫,最近开发中收集的这篇文章主要介绍python只读_只读特定行(Python),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果要读取的文件很大,并且不想一次读取内存中的整个文件:

fp = open("file") for i, line in enumerate(fp): if i == 25: # 26th line elif i == 29: # 30th line elif i > 29: break fp.close()

请注意,第i == n-1 。

在Python 2.6或更高版本中:

with open("file") as fp: for i, line in enumerate(fp): if i == 25: # 26th line elif i == 29: # 30th line elif i > 29: break

快速回答:

f=open('filename') lines=f.readlines() print lines[25] print lines[29]

要么:

lines=[25, 29] i=0 f=open('filename') for line in f: if i in lines: print i i+=1

有一个更优雅的解决方案提取许多行: linecache (礼貌“python:如何跳转到一个巨大的文本文件中的特定行?” ,前一个stackoverflow.com问题)。

引用上面链接的python文档:

>>> import linecache >>> linecache.getline('/etc/passwd', 4) 'sys:x:3:3:sys:/dev:/bin/shn'

将4更改为所需的行号,然后开机。 请注意,4会带来第五行,因为计数是从零开始的。

如果这个文件可能非常大,并且在读入内存时出现问题,那么采用@Alok的建议并使用enumerate()可能是一个好主意。

结束语:

使用fileobject.readlines()或for line in fileobject中的for line in fileobject作为小文件的快速解决方案。

使用linecache作为更优雅的解决方案,读取多个文件的速度会很快,可能会反复。

采取@ Alok的建议,并使用enumerate()文件可能是非常大的,并不适合内存。 请注意,使用此方法可能会因文件顺序读取而变慢。

一个快速和紧凑的方法可能是:

def picklines(thefile, whatlines): return [x for i, x in enumerate(thefile) if i in whatlines]

这接受任何打开文件的对象thefile (留给调用者是否应该从磁盘文件打开,或通过例如套接字或其他类似文件的流)和一组基于零的行索引whatlines ,以及返回一个列表,内存占用少,速度合理。 如果要返回的行数很大,你可能更喜欢一个生成器:

def yieldlines(thefile, whatlines): return (x for i, x in enumerate(thefile) if i in whatlines)

这基本上只适用于循环 – 注意唯一的区别是在return语句中使用圆括号而不是圆括号,分别作出列表理解和生成器表达式。

还要注意的是,尽管提到了“行”和“文件”,但这些函数更为普遍 – 它们可以在任何迭代器上工作, 无论是打开文件还是其他文件,都会返回项目列表(或生成器)基于他们的渐进项目数量。 所以,我建议使用更合适的通用名称;-)。

为了提供另一种解决方案:

import linecache linecache.getline('Sample.txt', Number_of_Line)

我希望这是快速和容易:)

如果你想要第7行

line = open(“file.txt”,“r”)。readlines()[7]

为了完整起见,这里还有一个选项。

让我们从python文档的定义开始:

切片通常包含一部分序列的对象。 当给出几个数字时,使用下标符号[[]与数字之间的冒号创建切片,如在variable_name [1:3:5]中。 括号(下标)表示法在内部使用切片对象(或在旧版本中,__getslice __()和__setslice __())。

虽然slice符号不能直接应用于迭代器,但itertools包中包含一个替换函数:

from itertools import islice # print the 100th line with open('the_file') as lines: for line in islice(lines, 99, 100): print line # print each third line until 100 with open('the_file') as lines: for line in islice(lines, 0, 100, 3): print line

该函数的另一个优点是它不会读取迭代器直到结束。 所以你可以做更复杂的事情:

with open('the_file') as lines: # print the first 100 lines for line in islice(lines, 100): print line # then skip the next 5 for line in islice(lines, 5): pass # print the rest for line in lines: print line

并回答原来的问题:

# how to read lines #26 and #30 In [365]: list(islice(xrange(1,100), 25, 30, 4)) Out[365]: [26, 30]

这个怎么样:

>>> with open('a', 'r') as fin: lines = fin.readlines() >>> for i, line in enumerate(lines): if i > 30: break if i == 26: dox() if i == 30: doy()

如果你不介意导入,那么fileinput完全是你所需要的(这是你可以读取当前行的行号)

您可以执行seek()调用,将读取头定位到文件中的指定字节。 这不会帮助你,除非你确切知道在你想要读取的行之前在文件中写入了多少个字节(字符)。 也许你的文件是严格格式的(每行是X字节数?)或者,如果你真的想要提高速度的话,你可以自己计算字符的数量(记得包括不可见的字符,如换行符)。

否则,您必须按照您所希望的行来读取每一行,如同这里已经提出的许多解决方案之一。

def getitems(iterable, items): items = list(items) # get a list from any iterable and make our own copy # since we modify it if items: items.sort() for n, v in enumerate(iterable): if n == items[0]: yield v items.pop(0) if not items: break print list(getitems(open("/usr/share/dict/words"), [25, 29])) # ['Abelsonn', 'Abernathyn'] # note that index 25 is the 26th item

这是我的小2美分,因为它是值得的;)

def indexLines(filename, lines=[2,4,6,8,10,12,3,5,7,1]): fp = open(filename, "r") src = fp.readlines() data = [(index, line) for index, line in enumerate(src) if index in lines] fp.close() return data # Usage below filename = "C:\Your\Path\And\Filename.txt" for line in indexLines(filename): # using default list, specify your own list of lines otherwise print "Line: %snData: %sn" % (line[0], line[1])

file = '/path/to/file_to_be_read.txt' with open(file) as f: print f.readlines()[26] print f.readlines()[30]

使用with语句打开文件,打印第26行和第30行,然后关闭文件。 简单!

读取文件的速度非常快。 读取一个100MB的文件不到0.1秒(请参阅我的文章用Python读取和写入文件 )。 因此,你应该完全阅读,然后使用单行。

这里最多的答案是没有错,但风格不好。 打开文件应该始终用with完成,因为它确保文件再次关闭。

所以你应该这样做:

with open("path/to/file.txt") as f: lines = f.readlines() print(lines[26]) # or whatever you want to do with this line print(lines[30]) # or whatever you want to do with this line

文件对象有一个.readlines()方法,它会给你一个文件内容列表,每个列表项一行。 之后,您可以使用正常列表切片技术。

我更喜欢这种方法,因为它更通用,也就是说,你可以在一个文件, f.readlines()的结果,一个StringIO对象上使用StringIO ,不管:

def read_specific_lines(file, lines_to_read): """file is any iterable; lines_to_read is an iterable containing int values""" lines = set(lines_to_read) last = max(lines) for n, line in enumerate(file): if n + 1 in lines: yield line if n + 1 > last: return >>> with open(r'c:tempwords.txt') as f: [s for s in read_specific_lines(f, [1, 2, 3, 1000])] ['An', 'an', 'aan', 'accordantn']

@OP,你可以使用枚举

for n,line in enumerate(open("file")): if n+1 in [26,30]: # or n in [25,29] print line.rstrip()

我认为这将工作

open_file1 = open("E:\test.txt",'r') read_it1 = open_file1.read() myline1 = [] for line1 in read_it1.splitlines(): myline1.append(line1) print myline1[0]

Alok Singhal的答案是一个更好的和微小的变化

fp = open("file") for i, line in enumerate(fp,1): if i == 26: # 26th line elif i == 30: # 30th line elif i > 30: break fp.close()

你可以很简单地用这个已经提到过的语法来做到这一点,但是这是迄今为止最简单的方法:

inputFile = open("lineNumbers.txt", "r") lines = inputFile.readlines() print (lines[0]) print (lines[2])

f = open(filename, 'r') totalLines = len(f.readlines()) f.close() f = open(filename, 'r') lineno = 1 while lineno < totalLines: line = f.readline() if lineno == 26: doLine26Commmand(line) elif lineno == 30: doLine30Commmand(line) lineno += 1 f.close()

最后

以上就是紧张小懒虫为你收集整理的python只读_只读特定行(Python)的全部内容,希望文章能够帮你解决python只读_只读特定行(Python)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部