0

我需要创建一个程序来读取文本文件并计算行数、单词数和字符数。如果单独分开,我可以在下面完成所有工作,但我想将其转换为使用函数,以便它可以读取一次文件,但我不断得到不同的答案并且不确定我做错了什么。

字码

print ' '
fname = "question2.txt"
infile = open ( fname, 'r' )
fcontents = infile.read()

words = fcontents.split()
cwords = len(words)

print "Words: ",cwords

字符代码

fname = "question2.txt"
infile = open ( fname, 'r' )
fcontents = infile.read()

char = len(fcontents)

print "Characters: ", char

行代码

fname = "question2.txt"
infile = open ( fname, 'r' )
fcontents = infile.readlines()

lines = len(fcontents)

print "Lines: ", lines

正确的结果

字数:87 字数:
559
行数:12

这是我在尝试使用函数时想到的,但就是不知道出了什么问题。

def filereader():
    fname = 'question2.txt'
    infile = open ( fname, 'r' )
    fcontents = infile.read()
    fcontents2 = infile.readlines()

    return fname, infile, fcontents, fcontents2


def wordcount(fcontents):
    words = fcontents.split(fcontents)
    cwords = len(words)
    return cwords

def charcount(fcontents):
    char = len(fcontents)
    return char

def linecount(fcontents2):
    lines = len(fcontents2)
    return lines


def main():

    print "Words: ", wordcount ('cwords')
    print "Character: ", charcount ('char')
    print "Lines: ", linecount ('lines')

main()

错误的结果

字数:2 字数:
4
行数:5

4

3 回答 3

2
    infile = open ( fname, 'r' )
    fcontents = infile.read()
    fcontents2 = infile.readlines()

您不能从文件中读取两次。

于 2012-09-05T14:22:40.243 回答
2

您需要filereader使用main

def main():
    fname, infile, fcontents, fcontents2 = filereader()
    print "Words: ", wordcount (fcontents)
    print "Character: ", charcount (fcontents)
    print "Lines: ", linecount (fcontents2)

否则,您将如何获取值fcontentsfcontents2传递给其他函数?您还需要修复filereader以确保它会读取一次文件:

def filereader():
    fname = 'question2.txt'
    infile = open ( fname, 'r' )
    fcontents = infile.read()
    fcontents2 = fcontents.splitlines(True)
    return fname, infile, fcontents, fcontents2

请注意,for 行fcontents2已修改为fcontents在换行符处拆分(请参阅 参考资料str.splitlines)。这也将为您提供一个字符串列表.readlines()

于 2012-09-05T14:24:20.473 回答
0

从文件中读取时,文件句柄会记住它在文件中的位置。因此,在您调用后infile.read()infile将被放置在文件的末尾。然后当您调用infile.readlines()时,它将尝试读取其当前位置和文件末尾之间的所有字符,因此返回一个空列表。

您可以使用 将文件倒回到其初始位置infile.seek(0)。因此:

>>> fcontents = infile.read()
>>> infile.seek(0)
>>> flines = infile.readlines()

将工作。

或者,将文件读入字符串fcontents后,您可以使用以下命令将字符串拆分为行splitlines

>>> fcontents = infile.read()
>>> flines = fcontents.splitlines()
于 2012-09-05T14:25:59.253 回答