用Python替换固定长度记录中的信息

时间:2017-12-07 06:40:18

标签: python python-3.x slice immutability

有趣的是,我在这个网站上发现了这个确切的问题 - 完全相同的家庭作业问题 - 但由于关于问题的信息不足,从未达成结论。希望我能有更好的运气。

我正在处理我的Python 3作业,而且我遇到了一个我正在努力解决的问题。

给出的确切提示是:

  

"您将被传递文件名' P',名字' F',姓氏' L',   和一个新的生日' B'在P中加载固定长度的记录文件,   在第一个中搜索F,L并将生日更改为B.然后保存   文件。"

这里的想法是我们创建一个程序,使用给定的变量将一个人的生日从一个未知变为另一个。作为我不耐烦的人,我打印()编辑P - 文件 - 并知道它是:

  

Adam Smith 11111985 Theodore Anderson
  03201990Monty Biscuit-Barrel 10181980Adam
  史密瑟斯10101960Ruthy Anderson 06062010

粘贴时间距会丢失,但名字和姓氏各有16个固定长度,生日长度固定为8个。

我尝试更改的生日的姓名是:

  

Adam Smithers

而我正试图将他的生日改为:

  

00000000

我尝试使用切片替换生日(因为根据我们的说明,在python中打开文本文件会将文件转换为字符串,因此会变成immutabel)。但是,当我尝试脚本时:

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

我收到错误消息" ' _io.TextIOWrapper'对象不是可订阅的"

我现在已经尝试了几个小时,但是还没有接近。任何建议都会在这一点上受到赞赏。谢谢

1 个答案:

答案 0 :(得分: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