2017-04-23 9 views
2

실제로 프로젝트에서 UDP를 사용하여 파일을 보내고 있습니다.이 프로토콜은 신뢰할 수 없으므로 각 패킷에 대한 정보를 추가했습니다. 데이터의 인덱스. 그래서 나는 올바른 순서로받은 데이터를 쓸 수 있습니다. 기능을 추구,이 경우에는 효과와 데이터를seek 함수가 특정 위치의 파일을 업데이트 할 수 없습니다. - python

while i < packet_num: 
    buf,address = recieve_packet(s,data_size+10) 
    i += 1 
    if buf: 
     print(buf) 
     index = int(buf[0:10].decode()) 
     data = buf[10:] 
     f.seek(seek_pointer + index*data_size,0) 
     f.write(data) 
     list_index.append(index) 

했습니다 나는 파일

이 새로운 데이터를 기록하지 처리 내 코드의 일부에서 특정 위치의 바이트를 작성하는 문제가 그냥 파일에 추가됩니다. 나는 "a + b"모드를 사용하여 파일을 엽니 다. tutorialspoint.com에서 인용

답변

2

, 파일이 'A'또는 'A +'를 사용하여 추가 열어 경우, 어떤 추구

주() 작업이 다음 쓰기에 취소 할 수 있습니다.

"a"모드 write 작업이 파일 끝에 추가됩니다. seek은 파일의 특정 위치에 쓰기/읽기 포인터를 설정합니다.

따라서 write이 호출되면 읽기/쓰기 포인터에 관계없이 파일 끝에 기록됩니다.

그러나 파일을 a+b에 열었으므로 특정 위치와 read 위치로 파일을 찾을 수 있습니다.

+0

예 정확히 "wb"를 사용하여 파일을 열었지만 큰 파일을 처리하기 위해 일부 파일을 보내므로 "ab"가 필요합니다.이 문제에 대한 해결책이 있습니까? –

+0

먼저 'r'모드로 기존 파일을 열고 내용을 가져올 수 있습니다. 그 후,'w' 모드로 파일을 다시 생성하고 기존의 주석을 쓰고, '찾기'하고 새로운 내용을 추가 할 수 있습니다. – Dashadower

+0

@RS Halim 그러나 대용량 파일로 작업하는 경우 메모리 오류가 발생할 수 있습니다. – Dashadower

1

'추가'모드를 사용하여 열면 모든 쓰기가 파일 끝으로 이동합니다. ypu가 이미받은 데이터를 추적하고 있다면 w+b 모드로 열면됩니다.

wb은 파일을 생성 (또는 비 웁니다)하고 쓰기를 허용합니다 (텍스트 모드가 아닌 바이너리로). w+b 동일하지만 독서도 가능합니다. 기존 파일을 자르지 않고 열려면 모드 r+b을 사용하면 기존 데이터를 그대로 유지하면서 읽기 및 쓰기가 가능합니다 (다시 말하면 b은 바이너리 모드로 사용하기에 적합합니다).

+0

은 파일을 업데이트하려고하기 때문에 "wb"가 "wb"와 동일하게 작동합니다. 이전 버전을 잃고 싶지는 않습니다. 데이터.. –