2016-11-12 3 views
1

파일에 데이터를 추가하려고합니다. 각 줄은 함수 안에 작성됩니다. 다음은 내 실제 코드를 기반으로 샘플 코드는 다음과 같습니다파이썬에서 파일 끝에 데이터를 추가하십시오.

a = 0 

def data(): 
    global a 
    a = int(raw_input('Enter value for a\n>')) 
    write() 

def write(): 
    f = open('path\\to\\file.txt', "a") 
    f.write('%s\n' % a) 
    f.close 
    proceed() 

def proceed(): 
    should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
    if should == '0': 
     return 
    else: 
     data() 

data() 

내가 예를 들어, 1, 2 and 3가의 값으로,이이 파일에 기록되는 방식이다, 코드를 실행 및 제공 :

3 
2 
1 

하지만이 파일에 이런 식으로 기록 할 :

1 
2 
3 

어떻게 그렇게 할 수있는 권리 방법이 될 것입니까? write 함수를 실행할 때마다 파일 끝에 새 줄을 어떻게 추가합니까?

+1

'f.close'가 파일을 닫지 않습니다! 전역 변수를 사용하여 데이터를 전달하는 것은 권장되지 않습니다. 매개 변수를 사용하십시오. 그리고 마침내 왜 나는이 결과물을 얻는 지 보지 못합니다. 추가 모드는 선 순서를 되돌릴 수 없으므로 의미가 없습니다. –

+0

@ Jean-FrançoisFabre 고맙습니다. 작동하도록했습니다. – rsnaveen

+0

@ Jean-FrançoisFabre 그건 내가 너무 이해하지 못했던거야. 파일이 닫히지 않더라도 파일 끝에 항상 데이터를 추가해서는 안됩니까? – rsnaveen

답변

2

프로그램 구조로 인해 매우 심한 재귀 (문제)가 발생할 수 있습니다. 왜냐하면 data()에서 write()를 호출하고 write()에서 proceed()를 호출하고 proceed()에서 data()를 다시 호출하기 때문입니다. 이런 종류의 구조를 피하십시오. 다음 코드는이 문제를 피하고 더 짧습니다.

def data(): 
    while True: 
     a = int(raw_input('Enter value for a\n>')) 
     f.write(str(a) + '\n') 

     should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
     if should == 0: 
      break 


f = open('path\\to\\file.txt', "a") 
data() 
f.close() 
+0

내가 제공 한 샘플 코드는 실제 코드의 구조를 보여주기위한 것입니다. 입력을 받고 파일에 쓰는 것만으로도 코드가 훌륭하게 작동합니다. 그러나 원래 코드에서 필자는 몇 가지 기능을 가지고 있으며 각각의 연속 함수가 올바르게 실행되기 위해서는 앞의 함수가 오류없이 실행되어야합니다. 이것이 내가이 방법으로 코드를 구조화 한 이유입니다. 그러나 파일이 제대로 닫히지 않은 경우 추가 동작이 왜 작동하는지 설명 할 수 있습니까? 고맙습니다. – rsnaveen

+0

실제 코드의 구조로 인해 재귀 오류가 발생할 수 있습니다. 이것은 data()를 다시 호출하는 함수를 호출하는 함수를 호출 할 때 인터프리터가 오류를 던지기 전에 data()를 여러 번 호출 할 수 있다는 것을 의미합니다. 이 체인의 통화는 통역사가 추적해야하며 너무 많은 저장 공간이 있습니다. 마지막으로 스택 공간이 부족할 것입니다. Stackoverflow에 오신 것을 환영합니다. 파일을 제대로 닫지 않으면 값이 왜 위에서 아래로 쓰여지는지 모르겠습니다. close() 문 앞에 플러시되지 않은 파일 버퍼 일 수 있습니다. – Ukimiku

+0

고마워요 @Ukimiku. 재귀 오류를 피하기 위해 프로그램을 재구성하려고 노력할 것입니다. – rsnaveen

1

@Ukimiku에서 요구 사항을 구현하는 올바른 방법이 제공되었습니다. 코드가 왜 그런 식으로 행동하는지에 대한 의견은 제 의견입니다. 사실, open('path','a')으로 파일을 열면 파일 포인터가 열려있는 파일의 끝으로 이동하므로 write()을 사용할 때 추가 할 수 있습니다.

f = open('path\\to\\file.txt', "a") 
print f.tell() #get the position of current file pointer 
f.write('%s\n' % a) 

file.txt를 연 후 print f.tell()을 추가하십시오. 열 때마다 포인터 위치는 항상 0입니다. 이는 write() 조작이 해당 파일의 시작 부분에 해당 숫자를 삽입 함을 나타냄니다. 폐쇄가 없어서 이런 일이 일어났습니다. 이러한 변경 사항은 메모리에서 발생하며 아직 디스크에 기록되지 않았습니다.

+0

설명해 주셔서 감사합니다 :) – rsnaveen

관련 문제