从某个位置开始替换字符串的一部分

Substituting part of a string starting at a position

我正在尝试有条件地更新从指定位置开始的字符串的一部分。我有这样的东西:

i = 0
bre = 'newtext'
with open(myfile, "r") as f:
    data = f.readlines()
    for line in data:
        if i > 0 and line[98] == '1':
            print 'ok'
            line[1562] = bre
        i += 1
        # write line to a file

我收到的错误是:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    line[1562] = bre

您正试图将一个字符串元素更改为另一个字符串

line = line[:1562] + bre + line[1563:]

# to skip the length of your bre
line = line[:1562] + bre + line[(1562+len(bre)):]

例子

bre = 'newtext'

myString = "asdfghjkl"

#replace character at index 2 with my string bre
myString = myString [:2]+ bre+ myString [3:]

print(myString)
asnewtextfghjkl

字符串也不像列表那样可变

您不能转到索引并更改字符

例子

s = "abc"
a[1] = 'z' # is wrong because 'str' object does not support item assignment

s = a[:1] + 'z' + a[2:] #but this will work
# this takes the pointer s and points it a completely new string

有趣的事实: 这就是您可以使用字符串作为字典中的键而不是列表的原因。字符串可以被散列

在 python 中,字符串是不可变的。此外,当您执行 line[1562] = bre 时,您正试图将一个字符串 (bre) 分配给另一个字符 (line[1562])。幸运的是在python 中很简单地解决了这个问题。执行此操作的一个好方法是将所有先前的 line 字符串与 breline 字符串之后的字符串连接起来。最后,您将其分配给 var line。 像

line = line[:1562] + bre + line[1563:]

但是请注意,当您这样做时,data 对象中的行不会改变。您只是在更改它的副本。如果你想读取一个文件行然后将它写入文件中,你需要做一些像

这样的事情
i = 0
bre = 'newtext'
with open(myfile, "r") as f:
    data = f.readlines()
for x,line in enumerate(data):
    if i > 0 and line[98] == '1':
        print 'ok'
        data[x] = line[:1562] + bre + line[1563:]
    i += 1

with open(new_file, 'w') as f
    for line in data:
      f.write(data)

你在问题中提供的上下文太少,无法给你一个完整的答案,但我发现你的代码有一个主要问题:你试图分配给一个 str 对象,但是 str是不可变的。

如果您报告了完整的回溯,您会注意到类似以下内容:

TypeError: 'str' object does not support item assignment

因此您必须从已有的字符串开始创建一个新字符串,例如:

s = 'I like dogs more than mice!'
t = 'cat'
n = 7
u = s[:n] + t + s[n + len(t):]
print(u)
# I like cats more than mice!