Python 3.6.1:代码在for循环后不执行

eyh26e7m  于 2023-02-20  发布在  Python
关注(0)|答案(2)|浏览(228)

我一直在学习Python,我想写一个脚本来计算文本中的字符数,并计算它们的相对频率。但首先,我想知道文件的长度。我的意图是,当脚本逐行计算所有字符时,它会打印当前行和总行数,这样我就可以知道它需要多少。
我执行了一个简单的for循环来计算行数,然后执行了另一个for循环来计算字符数并将它们放入字典。然而,当我使用第一个for循环运行脚本时,它提前停止了。据我所知,它甚至没有进入第二个for循环。如果我删除这个循环,其余的代码将正常运行。是什么导致了这种情况?
原谅我的准则。很简单,但我很自豪。
我的代码:

import string

fname = input ('Enter a file name: ')

try:
    fhand = open(fname)

except:
    print ('Cannot open file.')
    quit()

#Problematic bit. If this part is present, the script ends abruptly.
#filelength = 0
#for lines in fhand:
#    filelength = filelength + 1

counts = dict()
currentline = 1
for line in fhand:
    if len(line) == 0: continue
    line = line.translate(str.maketrans('','',string.punctuation))
    line = line.translate(str.maketrans('','',string.digits))
    line = line.translate(str.maketrans('','',string.whitespace))
    line = line.translate(str.maketrans('','',""" '"’‘“” """))
    line = line.lower()
    index = 0
    while index < len(line):
        if line[index] not in counts:
            counts[line[index]] = 1
        else:
            counts[line[index]] += 1
        index += 1
    print('Currently at line: ', currentline, 'of', filelength)
    currentline += 1

listtosort = list()
totalcount = 0

for (char, number) in list(counts.items()):
    listtosort.append((number,char))
    totalcount = totalcount + number

listtosort.sort(reverse=True)
for (number, char) in listtosort:
    frequency = number/totalcount*100
    print ('Character: %s, count: %d, Frequency: %g' % (char, number, frequency))
hrysbysz

hrysbysz1#

看起来你这样做很好,但是为了模拟你的问题,我下载并保存了一本 gutenberg 的教科书。这是一个unicode问题。有两种方法可以解决它。作为一个二进制文件打开它或者添加编码。因为它是文本,我会选择utf-8选项。
我还建议你用不同的方式编写它,下面是基本结构,它在打开文件后关闭文件。

filename = "GutenbergBook.txt"
try:
    #fhand = open(filename, 'rb')
    #open read only and utf-8 encoding
    fhand = open(filename, 'r', encoding = 'utf-8')
except IOError:
    print("couldn't find the file")
else:
    try:
        for line in fhand:
            #put your code here
            print(line)
    except:
        print("Error reading the file")
finally:
    fhand.close()
vpfxa7rd

vpfxa7rd2#

对于op来说,这是一个特殊的情况,但是对于访问者来说,如果你的for状态下的代码没有执行,这不是python内置的问题,最有可能的是:父调用程序中的异常错误处理
你的迭代是在一个函数内,这个函数是在调用者的try except块内调用的,那么如果在循环过程中发生任何错误,它将被转义。
这个问题可能很难发现,尤其是在处理复杂的体系结构时。

相关问题