Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串中的特定索引更改为相同的值_Python_String_File Io - Fatal编程技术网

Python 将字符串中的特定索引更改为相同的值

Python 将字符串中的特定索引更改为相同的值,python,string,file-io,Python,String,File Io,目标 读取大约1.3GB大小的海量二进制文件并更改某些位,然后将其写回单独的文件(无法修改原始文件) 方法 当我读入二进制文件时,它被存储在一个以十六进制格式编码的大量字符串中,因为我使用的是python,所以这个字符串是不可变的 我的算法循环遍历整个文件,并将需要修改的字符串的所有索引存储在一个列表中。问题是字符串中的所有索引都需要修改为相同的值。由于不可改变的本性,我无法在适当的地方做到这一点。我无法将其转换为字符列表,因为这会破坏我的内存限制并占用大量时间。可行的做法是将其存储在一个单独的

目标

读取大约1.3GB大小的海量二进制文件并更改某些位,然后将其写回单独的文件(无法修改原始文件)

方法

当我读入二进制文件时,它被存储在一个以十六进制格式编码的大量字符串中,因为我使用的是python,所以这个字符串是不可变的

我的算法循环遍历整个文件,并将需要修改的字符串的所有索引存储在一个列表中。问题是字符串中的所有索引都需要修改为相同的值。由于不可改变的本性,我无法在适当的地方做到这一点。我无法将其转换为字符列表,因为这会破坏我的内存限制并占用大量时间。可行的做法是将其存储在一个单独的字符串中,但由于不可变的性质,我必须生成大量的字符串对象并继续连接到它们


我使用了来自的一些想法,但是它没有给我一个好的表现。有什么想法吗?目标是将现有的超长字符串精确复制到另一个字符串中,除了由索引列表中的值确定的某些占位符

如何对字符串进行切片,修改每个切片,在继续下一个切片之前将其写回磁盘?对磁盘来说太密集了?

因此,老实说,您不应该将文件读入字符串。除了实际更改的字节之外,您不应该特别编写任何内容。 这只是浪费资源,因为您似乎只是在线性地读取文件,并记下需要修改的位置

在所有支持某种程度mmap的操作系统(即Unix,其中包括Linux、OS X、*BSD和其他操作系统,如Windows)上,您可以使用module以读/写模式打开文件,扫描文件并就地编辑,而无需将其完全加载到RAM中,然后再将其写回。愚蠢的示例,将所有12值字节转换为位置相关的内容:

注意:此代码是我的,未经麻省理工学院许可。它用于文本增强目的,因此由SA抄送。谢谢你让这个愚蠢的声明成为必要

import mmap
with open("infilename", "r") as in_f:
  in_view = mmap.mmap(in_f.fileno(), 0) ##length = 0: complete file mapping
  length = in_view.size()
  with open("outfilename", "w") as out_f
    out_view = mmap.mmap(out_f.fileno(), length)
    for i in range(length):
       if in_view[i] == 12:
         out_view[i] = in_view[i] + i % 10
       else:
         out_view[i] = in_view[i]

我将实际尝试一下,我固有的假设是,磁盘将大大降低程序的速度。但是,看到实际的性能权衡可能会很有趣。是的,我想留下一条评论来开始讨论,但我没有足够的声誉…替换品的大小与原来的相同?我希望您能找到文件的位置并在磁盘上写入。您说“写回”,但在对我的回答的评论中说“限制是不更改原始文件”。这是一个矛盾的问题。编辑的问题-为歧义道歉这听起来是一个不错的解决方案,但是限制是我不能修改输入文件,我需要将其写入一个单独的文件格式,该格式将链接到另一个进程。所以在记忆中改变它对我没有好处。另外,一些输入文件是只读的,我甚至没有mmap权限,还有其他建议吗?您仍然可以将其mmap为只读,并将内容复制到第二个写mmap文件中。那就是我要做的。