我正在使用python 3.3.3。我正在从tutorialspoint.com上做教程。我无法理解这个错误是什么。
这是我的代码:
fo = open("foo.txt", "w")
print ("Name of the file: ", fo.name)
# Assuming file has following 5 lines
# This is 1st line
# This is 2nd line
# This is 3rd line
# This is 4th line
# This is 5th line
seq = ["This is 6th line\n", "This is 7th line"]
# Write sequence of lines at the end of the file.
fo.seek(0, 2)
line = fo.writelines( seq )
# Now read complete file from beginning.
fo.seek(0,0)
for index in range(7):
# line = fo.next()
print ("Line No %d - %s" % (index, line)+"\n")
# Close opend file
fo.close()
错误:
Name of the file: foo.txt
Traceback (most recent call last):
File "C:/Users/DELL/Desktop/python/s/fyp/filewrite.py", line 19, in <module>
line = fo.next()
AttributeError: '_io.TextIOWrapper' object has no attribute 'next'
答案 0 :(得分:27)
您遇到问题的原因有两个。首先是您在只写模式下创建了fo
。您需要一个可以读写的文件对象。您还可以使用with
关键字在完成后自动销毁文件对象,而不必担心手动关闭它:
# the plus sign means "and write also"
with open("foo.txt", "r+") as fo:
# do write operations here
# do read operations here
第二个是(就像你已经强烈建议的错误所表明的那样)文件对象fo
,一个文本文件对象,没有next
方法。您正在使用为Python 2.x编写的教程,但您正在使用Python 3.x.这对你来说并不顺利。 (我相信next
/可能在Python 2.x中有效,但它不在3.x中。)相反,Python 3.x中与next
最相似的是readline
,如此:
for index in range(7):
line = fo.readline()
print("Line No %d - %s % (index, line) + "\n")
请注意,这仅在文件至少有7行时才有效。否则,您将遇到异常。迭代文本文件的更安全,更简单的方法是使用for循环:
index = 0
for line in file:
print("Line No %d - %s % (index, line) + "\n")
index += 1
或者,如果你想获得更多pythonic,你可以使用enumerate函数:
for index, line in enumerate(file):
print("Line No %d - %s % (index, line) + "\n")
答案 1 :(得分:3)
您没有正确遵循教程。您已打开文件只写 open("foo.txt", "w")
动作line = fo.next()
是一个读取,所以很明显它会崩溃。
所以通过打开和来解决它:fo = open("foo.txt", "r+")
但这仅适用于 Python 2.7 ,您应该使用 next 或通过其他方式修复迭代。检查@ furkle的答案。
本教程可能也不正确,请参阅此处的模式说明:python open built-in function: difference between modes a, a+, w, w+, and r+?
答案 2 :(得分:0)
您可以在python3.x中使用fo.\__next__()
或fo.next()
。
答案 3 :(得分:0)
除了其他人提到的文件模式问题 "r+"
之外,发生 OP 引用的错误消息是因为 f.next()
方法在 Python 3.x 中不再可用。它似乎已被内置函数“next()”(https://docs.python.org/3/library/functions.html#next) 取代,该函数调用迭代器的 .__next__()
方法。
您可以在代码 line = fo.__next__()
的方法中添加下划线 - 但最好使用内置函数:line = next(fo)
我知道这是一个老问题 - 但我觉得包含这个答案很重要。