Python 3.x Python 3.6.1:代码在for循环后不执行
我一直在学习Python,我想写一个脚本来计算文本中的字符数并计算它们的相对频率。但首先,我想知道文件的长度。我的意图是,当脚本逐行计算所有字符时,它将打印当前行和总行数,这样我就可以知道需要多少 我执行了一个简单的for循环来计算行数,然后执行另一个for循环来计算字符数并将它们放入字典中。但是,当我使用第一个for循环运行脚本时,它会提前停止。据我所知,它甚至没有进入第二个for循环。如果我删除这个循环,其余的代码就可以正常运行。这是什么原因造成的 请原谅我的密码。这是初步的,但我很自豪 我的代码:Python 3.x Python 3.6.1:代码在for循环后不执行,python-3.x,loops,Python 3.x,Loops,我一直在学习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))
导入字符串
fname=input('输入文件名:')
尝试:
fhand=打开(fname)
除:
打印('无法打开文件')
退出
#有问题的一点。如果出现此部分,脚本将突然结束。
#filelength=0
#对于fhand中的线路:
#filelength=filelength+1
计数=dict()
currentline=1
对于fhand中的线路:
如果len(line)==0:继续
line=line.translate(str.maketrans(“”,,,string.标点))
line=line.translate(str.maketrans(“”,,,string.digits))
line=line.translate(str.maketrans(“”,,,string.whitespace))
line=line.translate(str.maketrans(“”,“”,“”,“”“”)
line=line.lower()
索引=0
当索引
您这样做看起来不错,但是为了模拟您的问题,我下载并保存了一本古腾堡教科书。这是一个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()
如果第一个循环存在,它将消耗文件中的所有行,而第二个循环则不需要读取任何行。您需要执行
fhand.seek(0)
在循环之间倒带文件。当我试图计算古腾堡项目中的《傲慢与偏见》时,我不得不将这一行包括在内,因为它会计算统计数据中的那些引号。它们在另一个翻译中没有被删除。这真的是一种权宜之计。哦,我现在明白了。所以有一个隐藏的计数器可以跟踪t我在哪一行,然后我必须用fhand.seek(0)重置它。我想我在我的脑海中,它会在每个for循环上重置自己。我不知道,谢谢。谢谢。我会记住这些特性。我仍然掌握开放命令、编码等的窍门。