2017-09-02 52 views
4

我想从文件中读取第25行到第55行,但范围似乎只输出单个数字和6行,当它应该是30行时。按编号输出特定行

hamlettext = open('hamlet.txt', 'r') 
for i in range (25,55): 
    data = hamlettext.readlines(i) 

print(i) 
print(data) 

输出:

54 
['\n', 'Mar.\n', 'O, farewell, honest soldier;\n', "Who hath reliev'd you?\n"] 

回答

4

使用内置enumerate功能:

for i, line in enumerate(hamlettext): 
    if i in range(25, 55): 
     print(i) 
     print(line) 
+0

谢谢!这两个答案的工作很好 - 枚举能够打印得更干净,没有每行中的引号。这是枚举中的内置清理吗? – aiwan

+0

@aiwan:根据文档,'enumerate'返回一个包含count(从start开始,默认为0)和从迭代中获得的值的元组。在文件的情况下,它会创建一对像'(0,'这是第一行\ n')',然后可以用它来跟踪一个行的位置。您可以通过点击我的答案中的超链接阅读更多关于'枚举'的信息。 –

+0

知道了,谢谢! – aiwan

-2

所以你i在上面的代码打印的最后一行。要读取从25到55的所有行,您需要在循环内打印数据。

hamlettext = open('hamlet.txt', 'r') 
    for i in range (25,55): 
     data = hamlettext.readlines(i) 

     print(i) 
     print(data) 
+0

这是不正确的,因为'readlines(i)'不会从文件中检索行'i'。 “如果给定一个可选参数'sizehint',它会从文件中读取很多字节,并且足够多的来完成一行,并从中返回行。” –

2

你可以读取该文件完全然后切片获得的行列表:

with open('hamlet.txt', 'r') as f: 
    data = f.readlines()[25:55] 

如果该文件是大的,但是,它是更好地跳过25行,然后阅读,然后全身而退循环,以避免读取千条其他线路白白:

with open('hamlet.txt', 'r') as f: 
    for i, line in enumerate(hamlettext): 
     if i < 25: 
      continue 
     elif i >= 55: 
      break 
     else: 
      print(i,line.rstrip()) 

还要注意,如果你用文本编辑器比较行号,有0是一个1偏移(蟒蛇开始,编辑从1开始,所以你可以se enumerate(hamlettext,1)来解决这个问题。