2017-12-07 19 views
0

흥미롭게도이 웹 사이트에서 정확한 질문을 발견했습니다. 정확하게 똑같은 숙제 문제가 있었지만 문제에 대한 정보가 충분하지 않아 결론에 도달하지 못했습니다. 바라기를, 나는 더 운이 좋을 것이다.Python의 고정 길이 레코드 정보 교환

나는 파이썬 3 숙제를 연구하고 있으며, 나는 정말로 고심하고있다.

주어진 정확한 메시지는 다음과 같습니다

는 "당신은 파일 이름 'P', 이름 'F', LASTNAME 'L', 새로운 생일 'B'를 전달됩니다 고정 길이를로드합니다. P에 파일을 기록하고 첫 번째로 F, L을 찾고 생일을 B로 변경하십시오. 그런 다음 파일을 저장하십시오. "

주어진 변수를 사용하여 사람의 생일을 알 수없는 것으로 바꿀 수있는 프로그램을 만드는 아이디어입니다.

아담 스미스 (Adam Smith) 11111985Theodore 앤더슨
03201990Monty 비스킷 통 10181980Adam
스미 더스 10101960Ruthy

앤더슨 06062010 : 파일 - 그리고 그것이 알고 (-) 에드 P 내가 인쇄 오전 참을성이 사람 인

간격은 붙여 넣기에 분실하지만, 이름과 성 (16) 각각의 고정 된 길이를 가지고 있고, 생일은 8

의 고정 된 길이 birthd이야 개인의 이름이

아담 스미 더스

내가 그의 생일을 변경하려고 오전 : 바깥 I 변경 시도하고있다

00000000

나는 시도했다 생일을 slice를 사용하여 바꾸기 (우리의 지시에 따라, 파이썬에서 텍스트 파일을 여는 것은 파일을 문자열로 바꿈으로써 immutabel입니다). 내가 스크립트하려고 할 때, :

with open(P) as p: 
    new_file = p[0:141] + B + p[161:] 

을 나는

내가 지금 몇 시간 동안이 변통하기 위해 노력했습니다 " '_io.TextIOWrapper'개체가 첨자에 있지 않습니다"오류 메시지가 나타납니다 만, 더 이상 가까이 가지 않았다. 모든 제안은이 시점에서 인정 될 것입니다. 고마워요

+0

힌트 : 다음은 걸릴 확장 할 수있는 부분 코드의 전체 파일을 읽고, 공백을 분할, 당신은 지금, 새로운 목록을 얻을에 마지막 목록의 3 개 요소를 스테핑 새 목록을 만들 수 있습니다 시간, 이제 2 차원 배열을 얻었습니다. 나머지는 스스로 생각해보십시오! –

답변

0

숙제의 설명에서 나는 기존 파일을 업데이트해야한다는 것을 알고 있습니다. 이를 위해 메모리 맵 (mmap)을 사용할 수 있습니다.

import mmap 
import os 

def memory_map(filename): 
    size = os.path.getsize(filename) 
    fd = os.open(filename, os.O_RDWR) 
    return mmap.mmap(fd, size, access=mmap.ACCESS_WRITE) 

def update_file(P, F, L, B): 
    with memory_map(P) as p: 
     # Find the offset of the right record with F and L 
     p[141:157] = B