2017-01-28 4 views
3

this rosalind problem에서 손을 잡고 문제가 발생했습니다. 나는 내 코드의 모든 것이 정확하다고 믿지만 분명히 의도 한대로 실행되지 않기 때문에 분명하지 않다. 나는 파일의 내용을 지우고 그 파일에 어떤 텍스트를 쓰려고한다. 이 프로그램은 원하는 텍스트를 씁니다. 그러나 처음 내용을 삭제하지는 않습니다.파일 쓰기 전에 파일 내용을 삭제하십시오 (파이썬에서)?

def ini5(file): 
raw = open(file, "r+") 
raw2 = (raw.read()).split("\n") 
clean = raw2[1::2] 
raw.truncate() 
for line in clean: 
    raw.write(line) 
    print(line) 

은 내가 본 적이 :

How to delete the contents of a file before writing into it in a python script?

하지만 내 문제가 계속 지속됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

제쳐두고, 이것은 좋은 습관이 아닙니다. 출력용으로 별도의 임시 파일을 만들고 완료되면 원본 파일 이름으로 바꾸는 것이 좋습니다. 그런 식으로 프로그램이 완료되지 않으면 입력 파일을 파괴하지 않으며, 동시에 실행되는 시스템의 다른 프로세스는 원래 버전이나 업데이트 된 형태로 항상 한 버전이나 다른 버전에 액세스 할 수 있습니다. –

답변

6

truncate()의 현재 위치는입니다. 그 문서 당 강조 덧붙여을 (사이즈가 지정되지 않은 경우 또는 현재 위치)

바이트 에서 지정된 크기를 리사이즈 스트림.

read() 뒤에 현재 위치가 파일의 끝입니다. 동일한 파일 핸들로 자르고 다시 쓰기를 원하면 seek(0)을 수행하여 처음으로 되돌아 가야합니다. 따라서

:

raw = open(file, "r+") 
contents = raw.read().split("\n") 
raw.seek(0)      # <- This is the missing piece 
raw.truncate() 
raw.write('New contents\n') 

(또한 raw.truncate(0)을 통과 할 수 있지만,이 포인터를 떠난 것 - 따라서 미래에 대한 위치가 기록 - 파일의 시작이 아닌 다른 위치에, 그 위치에 쓰기 시작했을 때 파일이 희미 해짐).

3

파일의 이전 데이터를 completley로 덮어 쓰려면 다른 mode을 사용하여 파일을 열어야합니다.

그것은해야한다 :

raw = open(file, "w") # or "wb" 

이 문제를 해결하려면 먼저 파일의 내용을 읽어

with open(file, "r") as f: # or "rb" 
    file_data = f.read() 
# And then: 
raw = open(file, "w") 

그리고 다음 write mode.This 방법을 사용하여 열을, 당신은 추가하지 것이다 텍스트를 파일에 저장하면 데이터 만 쓸 수 있습니다.

모드 파일 here에 대해 읽어보십시오.

+0

OP는 덮어 쓰기 전에 읽기를 수행하려고합니다. 그렇지 않으면 'w'를 사용했을 것입니다. 그러나 그 목적에는 적합하지 않습니다. 독자가 읽기 핸들을 닫은 다음 두 번째 쓰기 핸들을 만들 것을 제안한다면 그것은 가능하지만 좀 더 명확하게 표현할 수 있습니다. –

+0

네가 맞아, 나는 그것을 추가했다. 단순화를 위해 –

+1

upvote. 내가 그것을 피할 수 있다면 나는 읽기/쓰기를위한 핸들을 열지 않을 것이다. 나는 동일한 핸들을 재사용하는 것이 더 빠를 것이라고 생각하지만. –