2015-05-11 86 views
1

我有一个正在读取文件的Python脚本。 第一条命令对行进行计数。第二个打印第二行,尽管第二行不起作用。Python连续读取文件

lv_file = open("filename.txt", "rw+") 

# count the number of lines ================================= 
lv_cnt = 0 
for row in lv_file.xreadlines(): 
    lv_cnt = lv_cnt + 1 

# print the second line ===================================== 
la_lines = la_file.readlines() 
print la_lines[2] 

lv_file.close() 

当我把它写这样它的工作原理,但我不明白为什么我会关闭该文件并重新打开它来得到它的工作。是否有某种我滥用的功能?

lv_file = open("filename.txt", "rw+") 

# count the number of lines ================================= 
lv_cnt = 0 
for row in lv_file.xreadlines(): 
    lv_cnt = lv_cnt + 1 

lv_file.close() 

lv_file = open("filename.txt", "rw+") 

# print the second line ===================================== 
la_lines = la_file.readlines() 
print la_lines[2] 

lv_file.close() 
+1

'la_lines [2]'不会让你到第二行,而是返回**第三行* *文件的行。 – ZdaR

回答

4

文件对象是一个迭代器。一旦你完成了所有的操作,迭代器已经耗尽,进一步读取将不会执行任何操作。

为了避免关闭和重新打开该文件,你可以使用seek后退到开始:

lv_file.seek(0) 
1

你是什么后file.seek()

例子:根据您的代码

lv_file = open("filename.txt", "rw+") 

# count the number of lines ================================= 
lv_cnt = 0 
for row in lv_file.xreadlines(): 
    lv_cnt = lv_cnt + 1 

lv_file.seek(0) # reset file pointer 

# print the second line ===================================== 
la_lines = la_file.readlines() 
print la_lines[2] 

lv_file.close() 

这将RES等文件指针回到它的起始位置。

pydoc file.seek

seek(offset, whence=SEEK_SET)更改流位置到 给定字节偏移。偏移解释相对于由此指示的位置 。其值为:

SEEK_SET或0 - 流的开始(缺省值);偏移应为 零或正SEEK_CUR或1-当前流位置;偏移量可能为 为负SEEK_END或2 - 流结束;偏移量通常为 负值返回新的绝对位置。

新的2.7版:该SEEK_ *常量

更新:计数的没有更好的办法。文件中的行反复,只关心二号线:

def nth_line_and_count(filename, n): 
    """Return the nth line in a file (zero index) and the no. of lines""" 

    count = 0 

    with open(filename, "r") as f: 
     for i, line in enumerate(f): 
      count += 1 
      if i == n: 
       value = line 

    return count, value 

nlines, line = nth_line_and_count("filename.txt", 1) 
0

由于把xreadlines()保留一个指向它寄给你的最后一行,当你做

la_lines = la_file.readlines() 

就基本记住了它给你的最后一行的索引。 当你关闭文件,然后打开它,它会创建一个新的迭代器,并且它会再次指向第0行。

+1

自版本2.3起不推荐使用。改为使用文件中的行 - https://docs.python.org/release/2.3/lib/module-xreadlines.html –