【问题标题】:Substituting part of a string starting at a position替换从某个位置开始的字符串的一部分
【发布时间】:2020-08-08 06:17:19
【问题描述】:

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

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

【问题讨论】:

  • 还有什么问题?
  • @norok2 - 已编辑以反映错误消息。

标签: python string python-2.x


【解决方案1】:

您正在尝试将字符串的元素更改为另一个字符串

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

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

【讨论】:

  • 感谢您的回复库尔迪普。这几乎是我正在寻找的行为,但是,我希望新字符串取代这 10 个位置。通过添加myString,它增加了字符串的长度。字符串本身是固定宽度的线。
  • 很高兴它有帮助,请检查我是否添加了更新
  • 您可能还应该报告s = 'hello'; s[3] = 'world' 不起作用的原因。从您的短信看来,虽然上述方法不起作用,但 s = 'hello'; s[3] = 'x' 之类的东西会起作用,但事实并非如此。
  • 感谢您的洞察力,我已将其添加到我的回复中:)
【解决方案2】:

在 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)

【讨论】:

  • 第一个语句不成立,字符串在 Python 中是不可变的,list 不是!
【解决方案3】:

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

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

TypeError: 'str' 对象不支持项目分配

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

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!

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 2016-08-04
    • 2015-09-18
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多