2017-09-18 55 views
0

我寫了下面的代碼作爲我工作的一部分回車:Python 3.x都有 - 不計與LEN

input_file = open('/home/me/01vshort.txt', 'r') 
file_content = input_file.read() 
input_file.close() 
file_length_question = input("Count all characters (y/n)? ") 
if file_length_question in ('y', 'Y', 'yes', 'Yes', 'YES'): 
    print("\n") 
    print(file_content, ("\n"), len(file_content) - file_content.count(" ")) 

它計數輸出回車,所以以下文件( 01vshort.txt),我得到以下端子輸出:

Count all characters (y/n)? y 

0 
0 0 
1 1 1 

9 

......或者......

Count all characters (y/n)? y 

0 
00 
111 

9 

在這兩種情況下,答案建議立即進行刪除d是6,因爲有6個字符,但是我得到了9個結果。

我確信代碼省略的空白,並通過故意添加空格和使用和不使用線運行的代碼與我的輸入文件已經測試了這一點:

- file_content.count(" ") 

誰能幫助這裏來爲什麼結果是9而不是6?

也許它不是回車?

我也很好奇爲什麼9的結果縮進1個空格?輸入文件只是包含以下(含在該文件的末尾一個空行,行號中的示例所示):

1. 0 
2. 0 0 
3. 1 1 1 
4. 

...或...

1. 0 
2. 00 
3. 111 
4. 

感謝。

回答

2

如果你想忽略所有空白字符,包括製表符和換行符和其他控制字符:

print(sum(not c.isspace() for c in file_content)) 

會給你6你的期望。

或者,您可以利用事實上.split()方法沒有參數將分割任何空格字符的字符串。因此,將其拆分爲非空格塊,然後再將它們全部重新組合在一起,而不使用空格字符:

print(len(''.join(file_content.split()))) 
+0

我已經有時間來處理和實現這個了。我特別喜歡.splitt()方法的優雅,尤其是當與sys.stdout方法結合使用時,它可以跳過逗號來說明對這種字符(逗號)的「打印」敏感度。所以,我可以使用:>> '** sys.stdout.write(「%s」%(len(「」。join(file_content.split()))))結果或以下內容:>> ** sys.stdout.write(「%s%s%s」%(file_content,(「\ n」),len(「」。join(file_content.split()) )))**'...以非縮進格式打印文件內容和結果。 –

1

你得到9,因爲文件的內容可以這樣解釋:

file_content = "0\n0 0\n1 1 1\n" 

,你就只匹配空格(file_content.count(" "))。

爲了計算只有你想要麼人物:

  • 讀一行一行的文件,或
  • 使用正則表達式匹配的空白。

9的縮進:print過程中的逗號as outlined here

+0

謝謝。自從我開始使用Python已經有一個月了,我覺得我做得很好,但是如果你能夠提供逐行閱讀和正則表達式的例子,那現在就非常有用了。我發現這個網站的指導非常有用,但是我花了很長時間才把它編入我自己的代碼中。 –

+0

...和重新:額外的空間,謝謝。如果我拆分輸出行來刪除逗號,問題就解決了。 –