我正在尝试在文本文件中显示小写字母的总数,但是

时间:2019-04-06 23:29:28

标签: python

我已经获得了德古拉小说的文本文件,我想计算其中包含的小写字母的数量。我执行的代码没有问题,但是可以打印出4297。我不确定我哪里出错了,希望大家在这里指出我的问题。谢谢!

缩进不一定反映我在文本编辑器中看到的内容

def main():

        book_file = open('dracula.txt', 'r')
        lower_case = sum(map(str.islower, book_file))   

        print (lower_case)  

    book_file.close()
main()

预期:621607 结果:4297

4 个答案:

答案 0 :(得分:3)

遍历文件时,每次迭代都会得到一个 line 作为值。如果当前代码运行在字符而不是行上,则将是正确的。当您在较长的字符串(如书中的一行)上调用islower时,如果字符串中的所有字母均为小写字母,则仅返回True

在您的Dracula副本中,显然有4297行不包含大写字母,因此这就是您得到的结果。数字大得多。

您可以通过添加一个额外的步骤来将代码作为单个大字符串读取并对其进行迭代来修复代码。

def main():
    with open('dracula.txt', 'r') as book_file:
        text = book_file.read()
    lower_case = sum(map(str.islower, text))
    print(lower_case) 

我还通过使用with语句来处理关闭文件的方式来稍微修改了您的代码。很好,因为它会在退出预期的块时始终关闭文件,即使出了问题并且引发了异常。

答案 1 :(得分:0)

您可以使用正则表达式计算小写和大写字符

protected override async void OnAppearing()
{
    await _connection.CreateTableAsync<WishList>();
    var book = await _connection.Table<WishList>().ToListAsync();
    _book = new ObservableCollection<WishList>(book);
    base.OnAppearing();
}

private void PickAuthor_Clicked(object sender, EventArgs e)
{
    ExistingAuthors.ItemsSource = _book.Distinct().ToList();
    ExistingAuthors.Focus();
}

private void ExistingAuthors_SelectedIndexChanged(object sender, EventArgs e)
{
    authorName.Text = ExistingAuthors.Items[ExistingAuthors.SelectedIndex];
}

输出:

import re

text = "sdfsdfdTTsdHSksdsklUHD"

lowercase = len(re.findall("[a-z]", text))
uppercase = len(re.findall("[A-Z]", text))

print(lowercase)
print(uppercase)

您将需要将文件的读取方式更改为

15 
7

答案 2 :(得分:0)

with open('dracula.txt', 'r') as book_file:
   count=0 
   for line in book_file: # for each line in the file you will count the number # of lower case letters and add it to the variable "count"
      count+=sum(map(str.islower, line))  

print("number of lower case letters = " +int(count))

答案 3 :(得分:0)

这里是使用列表理解而不是map()

的版本

遍历文本中的字符并创建所有小写字符的列表。此列表的长度是文本中小写字母的数量。

with open('dracula.txt') as f:
    text = f.read()
lowers = [char for char in text if char.islower()]
print(len(lowers))