我只想打印一个从单独函数返回的文件:
def open_file():
while True:
try:
filename = input("Input a file name: ")
file=open(filename,'r')
return file
except FileNotFoundError:
print("Error: Enter a valid file.")
continue
else:
break
open_file()
for line in file:
print(line)
它提示输入文件,并在输入无效文件时给出错误并重新提交,但是当输入有效文件时,它会显示" file"没有定义。它虽然在open_file函数中定义,但是返回值...那么为什么不打印?
答案 0 :(得分:2)
file
是类对象的名称。你应该用别的东西;
代码中的问题是您不保存函数的返回代码。
def open_file():
while True:
filename = input("Input a file name: ")
try:
f = open(filename,'r')
return f
except FileNotFoundError:
print("Error: Enter a valid file.")
continue
f = open_file()
for line in f:
print(line)
您不需要else
条款,因为您从未接触过它。如果没有异常,则从函数返回,如果有 - 则无论如何都不会执行else子句。
try ... except 语句有一个可选的 else 子句,如果存在,则必须遵循所有except子句。如果try子句 没有引发异常,那么必须执行的代码才有用。
你可以用更优雅的方式做同样的事情;
for line in open_file():
print line
在文件对象上使用for循环进行迭代的行为会逐行迭代文件。
答案 1 :(得分:1)
首先,不要将file
用作变量。它是内置类型,如int
或str
。要打印从open_file
返回的文件,您需要使用file.readlines()
功能:
f = open_file()
for line in f.readlines():
print(line)
您open_file
功能的改进:
def open_file():
while True:
try:
return open(raw_input("Enter a file name: "), 'r')
except FileNotFoundError:
print("Error: Enter a valid file name.")
答案 2 :(得分:0)
file
是open_file
函数的本地变量。因此,在功能之外不可用。您应该为返回值分配:
def open_file():
while True:
try:
# ...
return file
except FileNotFoundError:
# ...
# no break needed; the return statement ends the function
file = open_file()
for line in file:
print(line)