2016-10-12 2 views
2

디렉토리에 fName.txt라는 파일이 있습니다. 다음 파이썬 스 니펫 (시뮬레이션에서 가져옴)을 실행하면 루프 (코드 단편 포함)를 세 번 실행하여 텍스트 파일에 3 개의 행과 2 개의 열에 6 개의 숫자를 추가 할 수 있습니다. 그러나 새로운 데이터를 쓰기 전에 파일을 완전히 비우고 싶습니다. (그렇지 않으면 스크립트를 여러 번 실행하면 시뮬레이션에 필요한 행이 3 개 이상 생성되어 말도 안되는 결과가 발생합니다. 즉, 스크립트는 이어야합니다. 시뮬레이션에서 방금 생성 된 행 3 개 참조). 나는 다음의 페이지 how to delete only the contents of file in python을 보았습니다. 어떻게하는지 설명합니다.하지만 그것을 나의 예제로 구현할 수는 없습니다. 특히, pass 문장 이후에, 나는 내 파일이 닫히고 그 파일이 print 문장이 실행되면 다시 닫혀 져야한다는 사실을 감안할 때 명령문의 순서를 확신 할 수 없다. 매번 나는 어떤 경우에도 피할 수없는 다른 오류 메시지를 받았습니다. 나는 그 중 하나를 사용하지 않고 단순한 형태의 조각을 떠나기로 결심 이유를파이썬 스크립트로 파일을 쓰기 전에 파일 내용을 삭제하는 방법은 무엇입니까?

/usr/lib/python3.4/site-packages/numpy/lib/npyio.py:1385: UserWarning: genfromtxt: Empty input file: "output/Images/MW_Size/covering_fractions.txt" warnings.warn('genfromtxt: Empty input file: "%s"' % fname) Traceback (most recent call last): File "Collector2.py", line 81, in LLSs, DLAs = np.genfromtxt(r'output/Images/MW_Size/covering_fractions.txt', comments='#', usecols = (0,1), unpack=True) ValueError: need more than 0 values to unpack

이것은 다음은 내용 (인쇄 문 다음 주로 예상) 삭제 된 것으로 나타났다 내가 수신 된 오류 중 하나 일종이다 해당 페이지에서 제안 :

covering_fraction_data = "output/Images/MW_Size/covering_fractions.txt"  
with open(covering_fraction_data,"mode") as fName: 
     print('{:.2e} {:.2e}'.format(lls_number/grid_number, dla_number/grid_number), file=fName) 
     fName.close() 

시뮬레이션의 각 실행 파일로 인쇄해야 3 개 행을 생성합니다. mode이 'a'인 경우, 3 개의 생성 된 선이 이미 일부 내용을 포함하고 있기 때문에 3 개 이상의 행을 포함하는 텍스트 파일을 생성하는 기존 파일에 추가됩니다. 'a'를 'w'로 변경하면 텍스트 파일에 3 개의 행이 인쇄되는 대신 1 개의 행만 인쇄됩니다. 처음 두 행은 원하지 않게 삭제됩니다.

해결 방법 :

이 모든 것을 피하기 위해 주위에있는 유일한 방법은 'A'mode를 선택하고 수동으로 코드를 실행하기 전에 파일의 내용을 삭제하는 것입니다. 이렇게하면 출력에서 ​​예상되는 코드를 실행 한 후 텍스트 파일에 3 개의 행만 생성됩니다.

질문 :

그래서, 내 질문은 어떻게 위의 코드를 수정할 수 있습니다이 세 가지 새 행으로 가득 자동으로 이전 및 을 파일 의 삭제를 할 사실에 "기본적으로? "

귀하의 도움에 감사드립니다.

+0

처음 –

+1

* "나는 * 내 예에 그것을 구현할 수 아니다"; 당신이 왜 할 수 없는지에 대해 자세히 설명해 주시겠습니까? –

+0

나는 그 문제에 대해 더 많은 연구를했다. 난 * 삭제 * 기능을 피하기 위해 노력하고 오히려 시뮬레이션이 실행될 때마다 'w'모드를 사용하여 처음부터 파일을 생산하고 있습니다. – Allan

답변

0

'w'를 사용하면 파일 내용을 삭제하고 파일을 덮어 쓸 수 있지만 위의 스 니펫이 포함 된 루프가 두 번 더 인쇄되지 않도록하여 두 개의 데이터 행을 더 많이 생성 할 수 없습니다. 즉, 'w'모드를 사용하면 코드에 3 번 인쇄하기로되어있는 코드와 호환되지 않습니다 (이 스 니펫을 포함하는 루프가 3 번 실행되기 때문에). 이런 이유로 필자는 주 파일 내부의 다음 명령 줄을 통해 파일을 비워야했습니다.py 코드 :

그런 다음 위에서 언급 한 코드 스 니펫에서 'a'모드를 사용하십시오. 이 방법은 첫 번째 두 행을 삭제하지 않고 루프를 실행하고 빈 파일에 예상대로 인쇄를 세 번 인쇄합니다. 파일을 삭제하는 열기 대신 추가 모드의 쓰기 모드로

3

'추가'모드 ('a')를 사용하여 파일을 엽니 다. 이 모드를 지정하면 새 텍스트가 기존 파일 내용에 추가됩니다. 당신은 '쓰기'모드, 즉 open(filename, 'w')을 찾고 있습니다. 을 열고을 열 때마다 파일 내용이 무시됩니다.

+0

죄송합니다. 원래 스 니펫에 'w'가 있는데 몇 번 변경하여 'a'가되었습니다. 하지만 여전히 'w'는 작동하지 않습니다. – Allan

+0

@Allan 이해가 안됩니다. 당신은 3 개의 달리기가 있고 당신은 마지막 것에서 결과 만 본 ㄴ다고 말한다. 그러나 코드에서 제공 한 코드는 한 번만 파일에 인쇄되므로 모든 실행에 대해 파일의 내용이 무시됩니다. 파일을 세 번 쓰고 있다면 'w'모드를 사용하면 파일을 열 때 **가 재정의됩니다 **. 즉, 프로그램 당 3 개의 결과를 원한다면 한 번만 열어서 쓰기를 계속하거나 'w'로 처음 열고 'a'로 다른 시간을 열어야합니다. – rubik

+0

오해해서 죄송합니다. 이 코드는 각 실행에 대해 세 개의 연속적인 행을 생성합니다. 나는 "3 번 달리다"라는 말을 사용하지 말았어야했다. 따라서 실제로 실행 당 3 개의 결과가 필요합니다. 한 번 열어보고 3 개의 행이 채워질 때까지 계속 쓰고 파일을 닫아야합니다. – Allan