2017-08-31 32 views
0

我正在嘗試編寫一個函數來計算文本文件中的字符數並返回結果。我有以下代碼;在Python中計算字符在文件中

def file_size(filename): 
    """Function that counts the number of characters in a file""" 
    filename = "data.txt" 
    with open(filename, 'r') as file: 
     text = file.read() 
     len_chars = sum(len(word) for word in text) 
     return len_chars 

這似乎在我的IDE中正常工作,當我測試運行它與我創建的文本文件。但是,當我將代碼提交給doctest程序時,我得到一個錯誤,說它總是給出10的輸出。任何幫助?

附上錯誤消息的屏幕截圖 Error screen

+0

你想統計獨特的字符嗎? –

+2

[計數字符和行從一個文件python 2.7]可能重複(https://stackoverflow.com/questions/14416522/counting-characters-and-lines-from-a-file-python-2-7) – ziMtyth

+2

你每次都計算同樣的東西......'filename =「data.txt」' –

回答

4

你不使用的功能的說法,但隨着不斷的"data.txt"覆蓋filename

def file_size(filename): 
    """Function that counts the number of characters in a file""" 
    with open(filename, 'r') as file: 
     return len(file.read()) 
+2

沒有內存效率 –

+0

@Chris_Rands:這裏不是主題。 – Daniel

+0

根據具體情況,人們可能更喜歡原始速度。 –

0

如果你只是想一個ASCII文件的文件大小,你應該使用os.stat

import os 

def file_size(filename): 
    st = os.stat(filename) 
    return st.st_size 

這個函數的一大優點是不需要讀取文件。 Python只是向文件系統詢問文件大小。

import os 
print(os.stat(filename).st_size) 
+2

注意,不一定是字符的數量,除非它使用像ascii這樣的8位編碼進行編碼。 –

1

的ASCII文件(THETA(1)運行)超級高效的解決方案這個方法的主要優點是比較使用f.read()的方法是它是懶惰,所以你不把整個文件讀入內存。

+1

不一定是你想要的,除非你認爲該文件是在一些8位編碼,如ascii。至少,它不會等同於OP的答案。爲了等價,文件需要處於「rb」模式。 –

+0

juanpa說什麼。這會計算字節數,而不是字符數,所以它不會總是給出正確的數字,例如,如果文件編碼爲UTF-8並且它包含非ASCII字符。 –

0

你可以使用sum()周圍iter(partial(f.read, 1), '')發電機表達,其靈感來自this answer

from functools import partial 

def num_chars(filename): 
    """Function that counts the number of characters in a file""" 
    with open(filename) as f: 
     return sum(1 for _ in iter(partial(f.read, 1), ''))