首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3-读取文件、计数和过滤文本

Python 3-读取文件、计数和过滤文本
EN

Stack Overflow用户
提问于 2016-09-29 09:35:33
回答 4查看 1.1K关注 0票数 0

我正在编写Python 3中的一段代码,其中包含以下提示:

练习2:编写一个程序来提示输入文件名,然后通读文件并查找格式为:X-DSPAM-Confidence:0.8475的行。当您遇到以X-DSPAM-Confidence:开头的行时,将该行拆分以提取该行上的浮点数。计算这些行的数量,然后计算这些行的垃圾邮件置信度值的总和。当您到达文件末尾时,打印出垃圾邮件的平均置信度。

我已经开始编写我的代码(如下所示),但不断收到来自Python的以下错误消息:

代码语言:javascript
复制
Traceback (most recent call last):
  File "spam_lines_in_file.py", line 14, in <module>
    for line in fhand:
NameError: name 'fhand' is not defined
0587388179:ch_07_files juliecruz$ 

我被弄糊涂了,因为我定义了变量'fhand‘。专家们有什么帮助吗?

代码语言:javascript
复制
count = 0
sum = 0
user = input('Please enter a file name')
try: 
    fhand = open(user)
except:
    print("Not a valid file")
for line in fhand:
    line = line.rstrip()
    if line.startswith('X-DSPAM-Confidence:'):
         print(lines)
         count += 1
         colon_position = int(line.find(":"))
         extract = line[colon_position+1:]
         number_extract = float(extract)
         sum += number_extract
print("Extracted lines", count)
print("Sum of confidence values", sum)
print("Average of confidence values", sum/count)
EN

回答 4

Stack Overflow用户

发布于 2016-10-01 22:57:35

您的问题是,只有在没有发生异常的情况下,才会为fhand赋值。

你写道:

代码语言:javascript
复制
try: 
    fhand = open(user)
except:
    print("Not a valid file")

因此,在出现异常的情况下,不会为fhand赋值。这意味着当您试图迭代它时,Python会抛出一个NameError,因为它从未定义过。

也许你想要的是在出现异常的情况下终止?例如:

代码语言:javascript
复制
import sys
try: 
    fhand = open(user)
except:
    print("Not a valid file")
    sys.exit()

或者为fhand分配一个默认值

代码语言:javascript
复制
import sys
try: 
    fhand = open(user)
except:
    print("Not a valid file")
    fhand = 'Default content'
票数 0
EN

Stack Overflow用户

发布于 2016-10-01 23:02:44

最可能的原因是,如果在打开文件的过程中发生错误,则会显示一条警告消息“不是有效的文件”,但随后处理会继续。

在这种情况下,不会为fhand赋值,而是会有一个NameError

您可能需要一个循环,该循环反复询问文件名,并且只有在文件成功打开时才会breaks。

代码语言:javascript
复制
while True:
     name = input("filename ... ")
     try:
         fhand = open(name)
     except OSerror:   # only catch OS errors, not everything. 
         print("not a valid file") 
     else:
         break
票数 0
EN

Stack Overflow用户

发布于 2017-03-27 13:38:49

fhand是一个文件对象

代码语言:javascript
复制
try: 
    fhand = open(user)
except:
    print("Not a valid file")

您不能对文件对象执行以下操作。

代码语言:javascript
复制
for line in fhand:

您需要执行以下操作:

代码语言:javascript
复制
for line in fhand.readlines():

这对你来说还不是问题,但很快就会成为问题。

你真正的问题是:

当此代码

代码语言:javascript
复制
  try: 
        fhand = open(user)

抛出异常,则不会创建fhand变量,因此您需要在except块中退出。

代码语言:javascript
复制
try: 
    fhand = open(user)
except:
    print("Not a valid file")
    sys.exit(1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39760027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档