Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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_Replace - Fatal编程技术网

Python中的字符串操作

Python中的字符串操作,python,string,replace,Python,String,Replace,我正在将一些代码从另一种语言转换为python。该代码将相当大的文件读入字符串,然后通过数组索引对其进行操作,如: str[i] = 'e' 由于字符串是不可变的,因此这不能直接在python中工作。在python中执行此操作的首选方法是什么 我看到了string.replace()函数,但它返回的字符串副本听起来不是很理想,因为本例中的字符串是一个完整的文件。假设您没有使用可变长度的文本编码,如UTF-8,则可以使用array.array: l = list(str) l[i] = 'e'

我正在将一些代码从另一种语言转换为python。该代码将相当大的文件读入字符串,然后通过数组索引对其进行操作,如:

str[i] = 'e'
由于字符串是不可变的,因此这不能直接在python中工作。在python中执行此操作的首选方法是什么


我看到了
string.replace()
函数,但它返回的字符串副本听起来不是很理想,因为本例中的字符串是一个完整的文件。

假设您没有使用可变长度的文本编码,如UTF-8,则可以使用
array.array

l = list(str)
l[i] = 'e'
str = ''.join(l)
>>> import array
>>> a = array.array('c', 'foo')
>>> a[1] = 'e'
>>> a
array('c', 'feo')
>>> a.tostring()
'feo'
但由于您处理的是文件的内容,因此应该更高效:

>>> f = open('foo', 'r+')
>>> import mmap
>>> m = mmap.mmap(f.fileno(), 0)
>>> m[:]
'foo\n'
>>> m[1] = 'e'
>>> m[:]
'feo\n'
>>> exit()
% cat foo
feo
下面是一个快速基准测试脚本(对于非Unix操作系统,您需要用其他内容替换dd):

我在几年前的笔记本电脑上获得的输出符合我的直觉:

5+0 records in
5+0 records out
5242880 bytes transferred in 0.710966 secs (7374304 bytes/sec)
do_mmap 1.00865888596
do_array 1.09792494774
do_split 1.20163106918

所以mmap稍微快一点,但建议的解决方案没有一个特别不同。如果您看到了巨大的差异,请尝试使用查看需要花费的时间。

假设您没有使用可变长度文本编码(如UTF-8),则可以使用
数组。数组

>>> import array
>>> a = array.array('c', 'foo')
>>> a[1] = 'e'
>>> a
array('c', 'feo')
>>> a.tostring()
'feo'
但由于您处理的是文件的内容,因此应该更高效:

>>> f = open('foo', 'r+')
>>> import mmap
>>> m = mmap.mmap(f.fileno(), 0)
>>> m[:]
'foo\n'
>>> m[1] = 'e'
>>> m[:]
'feo\n'
>>> exit()
% cat foo
feo
下面是一个快速基准测试脚本(对于非Unix操作系统,您需要用其他内容替换dd):

我在几年前的笔记本电脑上获得的输出符合我的直觉:

5+0 records in
5+0 records out
5242880 bytes transferred in 0.710966 secs (7374304 bytes/sec)
do_mmap 1.00865888596
do_array 1.09792494774
do_split 1.20163106918
所以mmap稍微快一点,但建议的解决方案没有一个特别不同。如果您发现了巨大的差异,请尝试使用查看花费的时间。

尝试:

sl = list(s)
sl[i] = 'e'
s = ''.join(sl)
尝试:



其他人已经回答了您问题中的字符串操作部分,但我认为您应该考虑解析文件并修改文本表示的数据结构是否比直接操作文本更好。

其他人已经回答了您问题中的字符串操作部分,但是我认为您应该考虑是否最好解析文件并修改文本所代表的数据结构,而不是直接操作文本。

您总是替换同一列,还是搜索并替换?替换的内容取决于文件的内容您总是替换同一列吗,或者您执行搜索和替换?替换的内容取决于file@theycallmemorty:它消耗的内存是C的两倍,但除此之外,我看不出它为什么不工作。事实上,如果有很多这样的操作正在进行,可能最好将字符串保留为字符列表。这样做有效,并且似乎比另一个答案中的数组方法要快一些。然而,这两种方法都比我以前的代码慢得多;目前约7秒对0秒。4seconds@liw.fi:正确。完成所有基于字符的修改后,“”连接(l)行应该是user。@Zitrax:您以前的代码是什么?Python还是原始语言(C?)。另外,请看我对liw.fi评论的回复。@TheyCallMemory:它消耗的内存是C的两倍,但除此之外,我看不出它为什么不能工作。事实上,如果有很多这样的操作被执行,可能最好将字符串保留为字符列表。这样做有效,并且似乎比另一个答案中的数组方法要快一些。然而,这两种方法都比我以前的代码慢得多;目前约7秒对0秒。4seconds@liw.fi:正确。完成所有基于字符的修改后,“”连接(l)行应该是user。@Zitrax:您以前的代码是什么?Python还是原始语言(C?)。另外,请参阅我对liw.fi评论的回复。我似乎记得mmap仅适用于linux,因此您可能会面临可移植性问题。不,它适用于Unix和Windows()。有一些小的API差异,但没有影响这个用例。实际上,Windows上有一个更大的区别:do_mmap 0.6570006485;do_阵列1.0150001049;do_split 0.827999830246。感谢您提供有关cProfile的提示,它为我指出了问题所在。for循环使用了range(),这导致了大量开销。我切换到while循环,现在性能很好。酷!很高兴你找到了答案。我似乎记得mmap只适用于linux,所以你可能会面临可移植性问题。不,它适用于Unix和Windows()。有一些小的API差异,但没有影响这个用例。实际上,Windows上有一个更大的区别:do_mmap 0.6570006485;do_阵列1.0150001049;do_split 0.827999830246。感谢您提供有关cProfile的提示,它为我指出了问题所在。for循环使用了range(),这导致了大量开销。我切换到while循环,现在性能很好。酷!很高兴你明白了。