2014-01-07 61 views
-2

如果我的文件中的行數不是2的冪,但不超過64,我想添加' - '到最後一行,這樣線數成爲最接近的兩個冪。Python,添加到紡織品,但只有當行有一定的價值

這是我到目前爲止,它不適用於我,但我不知道如果我可能需要一個完整的其他功能來檢查號碼。

def name(): 
j=open('file.txt', 'r', encoding='utf-8') 
numbers=sum(1 for line in j) 
if numbers != 2 or 4 or 8 or 16 or 32 or 64: 
    j.append('-') 

有什麼建議嗎?

現在我有這個,仍然無法正常工作的所有方式,當它打印我不能看到所添加的行

def name(): 
with open('file.txt', 'r+', encoding='utf-8') as j: 
    numbers=sum(1 for line in j) 
    if numbers < 64: 
     lower2 = round(2**math.log(numbers, 2)) 
     if numbers > lower2: 
      missing = 2*lower2 - numbers 
      j.write('-\n' * missing) 

j=open('file.txt', 'r', encoding='utf-8') 
for i in j.readlines(): 
    print (i) 
    j.close() 
+0

在編輯的版本,你抄我的代碼錯誤。而不是'round(2 ** int(math.log(numbers,2)))',你只是做了'round(2 ** math.log(numbers,2))''。例如,給定數字'6','math.log(6,2)'大約是2.58,所以'int(math.log(6,2))'是2和'round(2 ** math.log (6,2))'是'4',這意味着有兩條缺失的行......但是'round(2 ** math.log(6,2))'當然只是'6',這意味着沒有缺失的行。 – abarnert

+0

如果你不明白對數是如何工作的,你應該嘗試用你理解的方式來寫數學。 (即使效率稍低或冗長,誰在乎呢?即使是最天真的算法也只需要幾條線,浪費在微秒以下......)另外,您需要學習如何進行基本調試 - 打印出中間值你正在計算,看看事情出了什麼問題,所以你有更多的信息可以繼續,而不僅僅是「它似乎沒有工作」。 – abarnert

+0

現在有效,非常感謝! – jmanikolina

回答

3

有多個問題與您的代碼:

  • 文件上沒有append方法。你write到文件。
  • 您無法寫入您明確要求以只讀方式打開的文件,其模式爲'r'。以不同的模式打開,如用於讀寫的'r+'
  • numbers != 2 or 4 or 8 or 16 or 32 or 64並不意味着你的想法。對於這個解釋,有幾十個問題;簡短的版本就是你想要的numbers not in (2, 4, 8, 16, 32, 64)
  • 你永遠不會close該文件,所以即使你設法寫入它,新的數據可能永遠不會被刷新到磁盤。解決此問題的最簡單方法是使用with語句,而不是顯式openclose

所以:

def name(): 
    with open('file.txt', 'r+', encoding='utf-8') as j: 
     numbers = sum(1 for line in j) 
     if numbers not in (2, 4, 8, 16, 32, 64): 
      j.write('-') 

What's going on with my if-else statement和各種鏈接/相關的瞭解爲何您or不工作的問題。

本教程中有關Reading and Writing Files的章節將解釋其他所有內容。


此外,文本文件應該通常以回車結束,除非你有一個很好的理由不,所以你可能想要寫'-\n',不只是'-'


同時,它似乎像,即使你實現你的算法正確的,它實際上並沒有做你想做的事:

我要添加「 - 」到最後一行如果我的文件中的行數不是2的冪,但不超過64,以至於行數成爲最接近的2的冪。

添加'-'到最後只會添加1行(或0,如果最後一行沒有以換行符結束)。所以,如果你有61行,現在你有62,而不是64。所以,我認爲你需要更改您的代碼是這樣的:

if numbers < 64: 
    while numbers not in (2, 4, 8, 16, 32, 64): 
     j.write('-\n') 
     numbers += 1 

但它可能是在這一點上只是做數學題簡單多了。例如:

if numbers < 64: 
    lower2 = round(2**int(math.log(numbers, 2))) 
    if numbers > lower2: 
     missing = 2*lower2 - numbers 
     j.write('-\n' * missing) 

或者,如果你要弄巧:

if numbers < 64: 
    higher2 = 2**numbers.bit_length() 
    missing = higher2 - numbers 
    j.write('-\n' * missing) 
+0

檢查編輯的問題 – jmanikolina

相關問題