我正在尝试设置一个系统,用于在文本文件上运行各种统计信息。在这项工作中,我需要在Python(v2.7.10)中打开一个文件,并将其作为行和字符串读取,以使统计函数起作用。
到目前为止,我有这个:
import csv, json, re
from textstat.textstat import textstat
file = "Data/Test.txt"
data = open(file, "r")
string = data.read().replace('\n', '')
lines = 0
blanklines = 0
word_list = []
cf_dict = {}
word_dict = {}
punctuations = [",", ".", "!", "?", ";", ":"]
sentences = 0
这会设置文件和初步变量。此时,print textstat.syllable_count(string)
返回一个数字。此外,我有:
for line in data:
lines += 1
if line.startswith('\n'):
blanklines += 1
word_list.extend(line.split())
for char in line.lower():
cf_dict[char] = cf_dict.get(char, 0) + 1
for word in word_list:
lastchar = word[-1]
if lastchar in punctuations:
word = word.rstrip(lastchar)
word = word.lower()
word_dict[word] = word_dict.get(word, 0) + 1
for key in cf_dict.keys():
if key in '.!?':
sentences += cf_dict[key]
number_words = len(word_list)
num = float(number_words)
avg_wordsize = len(''.join([k*v for k, v in word_dict.items()]))/num
mcw = sorted([(v, k) for k, v in word_dict.items()], reverse=True)
print( "Total lines: %d" % lines )
print( "Blank lines: %d" % blanklines )
print( "Sentences: %d" % sentences )
print( "Words: %d" % number_words )
print('-' * 30)
print( "Average word length: %0.2f" % avg_wordsize )
print( "30 most common words: %s" % mcw[:30] )
但是这会失败,因为22 avg_wordsize = len(''.join([k*v for k, v in word_dict.items()]))/num
会返回 ZeroDivisionError:float除以零。但是,如果我从第一段代码中注释掉string = data.read().replace('\n', '')
,我可以毫无问题地运行第二部分并获得预期的输出。
基本上,如何设置它以便我可以在data
上运行第二段代码,以及string
上的textstat?
答案 0 :(得分:1)
首先看行:
string = data.read().replace('\n', '')
您正在从数据中读取一次。现在,光标位于数据的末尾。
然后看行,
for line in data:
你试图再次阅读它,但你不能这样做,因为数据中没有别的东西,你就在它的末尾。所以len(word_list)
返回0。
你要除以它并得到错误。
ZeroDivisionError:浮点除零。
但是当你评论它时,现在你只阅读一次,这是有效的,所以你的代码的第二部分现在可以工作。
现在清楚?
那么,现在该怎么办?
在data.seek()
data.read()
演示:
>>> a = open('file.txt')
>>> a.read()
#output
>>>a.read()
#nothing
>>> a.seek(0)
>>> a.read()
#output again
答案 1 :(得分:1)
对data.read()
的调用将文件指针放在文件的末尾,因此此时您还没有更多要阅读的内容。您必须关闭并重新打开文件,或者更简单地使用data.seek(0)
答案 2 :(得分:1)
这是一个简单的修复。将行for line in data:
替换为:
data.seek(0)
for line in data.readlines():
...
它基本上指向文件的开头并逐行读取。
虽然这应该有效,但您可能希望简化代码并只读取一次文件。类似的东西:
with open(file, "r") as fin:
lines = fin.readlines()
string = ''.join(lines).replace('\n', '')