2009-07-27 9 views
2

파일에서 한 줄을 읽고 한 줄의 n 위치에 새로운 줄 ("\ n") 문자를 삽입하여 9 문자 줄 (예 : 다음과 같이 세 3 자 라인으로 변환됩니다 :파일의 실제 위치를 파이썬으로 작성하기

"123456789" (before) 
"123\n456\n789" (after) 

나는이 함께 시도했다 :

f = open(file, "r+") 
f.write("123456789") 
f.seek(3, 0) 
f.write("\n") 
f.seek(0) 
f.read() 

-> '123 \ n56789'나는 그것을 대체하지 원하는

위치 n의 문자. 다만, 그 자리에있는 nother ("\ n") char.

어떻게하는 지에 대한 아이디어가 있으십니까? 감사

나는이 방법으로 당신이하려고하는 것을 할 수있는 방법이 있다고 생각하지 않습니다

답변

7

: 당신이 삽입 할 위치에서 파일의 끝까지 읽어해야합니다, 다음 새 쓰기가 문자를 원하는 위치에 놓은 다음 원래 데이터를 다시 쓰십시오. 이는 seek() 유형 API를 사용하여 C 또는 임의 언어로 작업하는 것과 같은 방식입니다.

또는 파일을 문자열로 읽어 들인 다음 목록 메서드를 사용하여 데이터를 삽입하십시오.

source_file = open("myfile", "r") 
file_data = list(source_file.read()) 
source_file.close() 
file_data.insert(position, data) 
open("myfile", "wb").write(file_data) 
+0

+1 : ** 반드시 ** 파일을 읽고 다시 작성해야합니다. –

+0

-1을 입력하면 나중에 파일을 닫지 않고 파일을 여는 것이 가능합니다. 내가 마지막으로 확인한 것은 그렇게 좋은 생각은 아니며 특히 나중에 파일을 가지고 뭔가 다른 것을해야 할 필요가있는 경우 특히 그렇습니다. – JAB

+0

여전히 유용한 게시물입니다. – Skurmedel

1
with open(file, 'r+') as f: 
    data = f.read() 
    f.seek(0) 

    for i in range(len(data)): # could also use 'for i, chara in enumerate(data):' and then 'f.write(chara)' instead of 'f.write(data[i])' 
     if (i + 1) % 3 == 0: # could also do 'if i % 3 == 2:', but that may be slightly confusing 
      f.write('\n') 
     else: 
      f.write(data[i]) 

나는 그것을 생각하지 않는다는 데이터 파일을 사용하면 처리해야하는 경우에 (정말 정말 큰 경우를 제외하고 파이썬 (때문에 range(len(data))에)하지만, 작업을해야 모든입니다 데이터를 파일별로 파트별로 저장하고 결과를 다른 파일에 저장하여 아직 처리하지 않은 데이터를 덮어 쓰지 않도록합니다).

(More on the with statement.)

0

당신은 파일이 단지 문자의 배열입니다 생각할 수있는, 당신은 배열의 중간에 새로운 요소를 삽입 할 경우, 다음 이후에있는 모든 요소를 ​​이동해야 그것.

파일에 문자 또는 "확장"의 "링크 된 목록"이 포함되어 있지만 순차적으로 보려면 특수 편집기가 필요하다고 말할 수 있습니다.

관련 문제