2014-01-07 3 views
-2

내 파일의 줄 수가 2의 제곱 수가 아니라 64를 넘지 않으면 마지막 줄에 '-'를 추가하고 싶습니다. 라인 수는 2의 가장 가까운 제곱이됩니다.파이썬, 섬유에 추가하지만 줄에 특정 값이있는 경우에만

이것은 내가 지금까지 생각 해낸 것인데, 나에게는 효과가 없지만 숫자를 확인하기 위해 다른 모든 기능이 필요할 지 모르겠습니다.

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', 즉 누락 된 행이 2 개 있다는 것을 의미합니다 ... 그러나'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으로 기록 할 수 있습니다. 따라서 쓰기를 관리 했더라도 새 데이터가 디스크로 플러시되지 않을 수 있습니다. 이 문제를 해결하는 가장 쉬운 방법은 명시적인 openclose 대신 with 문을 사용하는 것입니다. 그래서

:

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의 거듭 제곱이됩니다.

마지막에 '-'을 추가하면 단 한 줄만 추가됩니다 (마지막 줄이 개행으로 끝나지 않은 경우 0 개). 예를 들어 61 줄이라면 64가 아닌 62가됩니다.

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

관련 문제