words = line.split('\n')
num_words += len(words)
没有做什么,你认为它。在该循环
for line in f:
line
是,在'\n'
结尾的字符串,所以line.split('\n')
是两项目列表,用含有除了终止'\n'
行的所有字符中的第一项;该列表中的第二项是空字符串。例如:
line = 'This is a test\n'
words = line.split('\n')
print(words, len(words))
输出
['This is a test', ''] 2
所以你num_words += len(words)
实际上并不算的话,它只是得到的行数的两倍数量。
要得到的话实际列表line
需要
words = line.split()
你倒数第二行
num_charsx = num_chars - line.count(' ')
是for
循环外,使它减去的最后一行的空间计数文件总数为num_chars
,但我假设你真的想从num_chars
减去整个文件的总空间数。
下面是您的代码的修复版本。
num_words = 0
num_chars = 0
num_spaces = 0
with open(fname, 'r') as f:
for num_lines, line in enumerate(f, 1):
num_words += len(line.split())
num_chars += len(line) - 1
num_spaces += line.count(' ')
num_charsx = num_chars - num_spaces
print(num_lines, num_words, num_chars, num_spaces, num_charsx)
我修改了行读取循环以使用enumerate
。这是获取行号和行内容的有效方式,无需维护单独的行计数器。
在num_chars += len(line) - 1
-1
是这样的,所以我们不包括字符计数中每行的终止'\n'
。
请注意,Windows文本文件行通常以'\r\n'
结尾,但是当您读取以文本模式打开的文件时,终止符会转换为'\n'
。因此,在Windows上,文件的实际字节大小为num_chars + 2 * num_lines
,假设最后一行的终止符为'\r\n'
;它可能不会,在这种情况下,实际大小将比这少2个字节。