我有一个从文件中读取的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()
答案 0 :(得分:4)
文件对象是迭代器。一旦你完成了所有的行,迭代器就会耗尽,进一步的读取将什么都不做。
为避免关闭并重新打开文件,您可以使用seek
快退到开头:
lv_file.seek(0)
答案 1 :(得分: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()
这会将文件指针重置回它的起始位置。
pydoc file.seek
:
seek(offset, whence=SEEK_SET)
将流位置更改为 给定字节偏移量。 offset是相对于位置解释的 由...表示。从哪里来的值是: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)
答案 2 :(得分:0)
因为xreadlines()保持指向它发送给你的最后一行的指针
la_lines = la_file.readlines()
它基本上会记住它给你的最后一行的索引。 当你关闭文件然后打开它时,它会创建一个新的迭代器,它再次指向第0行。