Python中的字符串操作

1 投票
4 回答
2234 浏览
提问于 2025-04-15 11:05

我正在把一些代码从其他语言转换成Python。这段代码会把一个比较大的文件读入一个字符串中,然后通过数组索引来处理这个字符串,比如:

str[i] = 'e'

但是在Python中这样做不行,因为字符串是不可变的。那在Python中,处理这个问题的推荐方法是什么呢?

我看到有一个 string.replace() 函数,但它返回的是字符串的一个副本,这样听起来不太高效,因为在这种情况下,字符串是整个文件。

4 个回答

1

其他人已经回答了你关于字符串处理的部分,但我觉得你应该考虑一下,是不是直接解析文件,然后修改文本所代表的数据结构会更好,而不是直接处理文本本身。

12

假设你没有使用像UTF-8这样的可变长度文本编码,你可以使用array.array

>>> import array
>>> a = array.array('c', 'foo')
>>> a[1] = 'e'
>>> a
array('c', 'feo')
>>> a.tostring()
'feo'

但是因为你在处理文件的内容,使用mmap会更有效率:

>>> 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换成其他的东西):

import os, time, array, mmap

def modify(s):
    for i in xrange(len(s)):
        s[i] = 'q'

def measure(func):
    start = time.time()
    func(open('foo', 'r+'))
    print func.func_name, time.time() - start

def do_split(f):
    l = list(f.read())
    modify(l)
    return ''.join(l)

def do_array(f):
    a = array.array('c', f.read())
    modify(a)
    return a.tostring()

def do_mmap(f):
    m = mmap.mmap(f.fileno(), 0)
    modify(m)

os.system('dd if=/dev/random of=foo bs=1m count=5')

measure(do_mmap)
measure(do_array)
measure(do_split)

我在几年前的笔记本电脑上得到的输出结果和我的直觉是一样的:

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稍微快一点,但没有哪个建议的解决方案特别不同。如果你看到的差别很大,试着用cProfile来看看到底是什么占用了时间。

9

这段代码的意思是……

首先,它定义了一个变量,这个变量用来存储一些信息。接着,它会执行一些操作,比如计算、判断或者循环。最后,代码可能会输出结果,或者把结果存到某个地方。

总之,这段代码就是在告诉计算机要做什么事情,按照一定的步骤来完成任务。

l = list(str)
l[i] = 'e'
str = ''.join(l)

撰写回答