Подставляя часть строки, начинающуюся с позиции - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь условно обновить часть строки, начиная с указанного места. У меня есть что-то вроде этого:

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

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Вы предоставляете слишком мало контекста в своем вопросе, чтобы дать вам полный ответ, но я вижу серьезную проблему с вашим кодом: вы пытаетесь присвоить объекту 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!
2 голосов
/ 24 апреля 2020

Вы пытаетесь изменить элемент строки, который является символом, на другую строку

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

также строка не является изменяемой, как список

вы не можете go в индекс и изменить символ

пример

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

FUN FACT: по этой причине вы можете использовать строку в качестве ключа в словаре но не список. строки можно хэшировать

1 голос
/ 24 апреля 2020

В python строка является неизменной. Более того, когда вы делаете line[1562] = bre, вы пытаетесь присвоить строку (bre) символу (line[1562]) в другой. К счастью, в python это очень просто решить. Хороший способ сделать это - объединить все предыдущие строки line с bre и после line строки. В конце концов вы назначаете это 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)
...