在Python中以多种方式读取文件

时间:2015-09-21 14:42:18

标签: python

我正在尝试设置一个系统,用于在文本文件上运行各种统计信息。在这项工作中,我需要在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?

3 个答案:

答案 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', '')