Допустим, у меня есть текстовый файл, содержащий:
Dan
Warrior
500
1
0
Есть ли способ отредактировать определенную строку в этом текстовом файле? Прямо сейчас у меня есть это:
#!/usr/bin/env python
import io
myfile = open('stats.txt', 'r')
dan = myfile.readline()
print dan
print "Your name: " + dan.split('\n')[0]
try:
myfile = open('stats.txt', 'a')
myfile.writelines('Mage')[1]
except IOError:
myfile.close()
finally:
myfile.close()
Да, я знаю, что myfile.writelines('Mage')[1]
это неверно. Но вы меня поняли, верно? Я пытаюсь отредактировать строку 2, заменив Воина на Мага. Но могу ли я это сделать?
Ответы:
Вы хотите сделать что-то вроде этого:
# with is like your try .. finally block in this case with open('stats.txt', 'r') as file: # read a list of lines into data data = file.readlines() print data print "Your name: " + data[0] # now change the 2nd line, note that you have to add a newline data[1] = 'Mage\n' # and write everything back with open('stats.txt', 'w') as file: file.writelines( data )
Причина в том, что вы не можете сделать что-то вроде «изменить строку 2» непосредственно в файле. Вы можете перезаписывать (но не удалять) части файла - это означает, что новое содержимое просто покрывает старое содержимое. Итак, если вы написали «Mage» над строкой 2, в результате получилась бы «Mageior».
источник
close.
но теперь я вижу, что использованиеwith
блока намного чище.вы можете использовать fileinput для редактирования на месте
import fileinput for line in fileinput.FileInput("myfile", inplace=1): if line .....: print line
источник
def replace_line(file_name, line_num, text): lines = open(file_name, 'r').readlines() lines[line_num] = text out = open(file_name, 'w') out.writelines(lines) out.close()
А потом:
replace_line('stats.txt', 0, 'Mage')
источник
Вы можете сделать это двумя способами, выберите то, что соответствует вашим требованиям:
Способ I.) Замена с использованием номера строки. В этом случае вы можете использовать встроенную функцию
enumerate()
:Сначала в режиме чтения получить все данные в переменной
with open("your_file.txt",'r') as f: get_all=f.readlines()
Во-вторых, напишите в файл (где вступает в действие enumerate )
with open("your_file.txt",'w') as f: for i,line in enumerate(get_all,1): ## STARTS THE NUMBERING FROM 1 (by default it begins with 0) if i == 2: ## OVERWRITES line:2 f.writelines("Mage\n") else: f.writelines(line)
Метод II.) Используя ключевое слово, которое вы хотите заменить:
Открыть файл в режиме чтения и скопировать содержимое в список
with open("some_file.txt","r") as f: newline=[] for word in f.readlines(): newline.append(word.replace("Warrior","Mage")) ## Replace the keyword while you copy.
«Воин» был заменен на «Маг», поэтому запишите обновленные данные в файл:
with open("some_file.txt","w") as f: for line in newline: f.writelines(line)
Это то , что выход будет в обоих случаях:
Dan Dan Warrior ------> Mage 500 500 1 1 0 0
источник
Если ваш текст содержит только одно лицо:
import re # creation with open('pers.txt','wb') as g: g.write('Dan \n Warrior \n 500 \r\n 1 \r 0 ') with open('pers.txt','rb') as h: print 'exact content of pers.txt before treatment:\n',repr(h.read()) with open('pers.txt','rU') as h: print '\nrU-display of pers.txt before treatment:\n',h.read() # treatment def roplo(file_name,what): patR = re.compile('^([^\r\n]+[\r\n]+)[^\r\n]+') with open(file_name,'rb+') as f: ch = f.read() f.seek(0) f.write(patR.sub('\\1'+what,ch)) roplo('pers.txt','Mage') # after treatment with open('pers.txt','rb') as h: print '\nexact content of pers.txt after treatment:\n',repr(h.read()) with open('pers.txt','rU') as h: print '\nrU-display of pers.txt after treatment:\n',h.read()
Если в вашем тексте несколько лиц:
импорт ре
# creation with open('pers.txt','wb') as g: g.write('Dan \n Warrior \n 500 \r\n 1 \r 0 \n Jim \n dragonfly\r300\r2\n10\r\nSomo\ncosmonaut\n490\r\n3\r65') with open('pers.txt','rb') as h: print 'exact content of pers.txt before treatment:\n',repr(h.read()) with open('pers.txt','rU') as h: print '\nrU-display of pers.txt before treatment:\n',h.read() # treatment def ripli(file_name,who,what): with open(file_name,'rb+') as f: ch = f.read() x,y = re.search('^\s*'+who+'\s*[\r\n]+([^\r\n]+)',ch,re.MULTILINE).span(1) f.seek(x) f.write(what+ch[y:]) ripli('pers.txt','Jim','Wizard') # after treatment with open('pers.txt','rb') as h: print 'exact content of pers.txt after treatment:\n',repr(h.read()) with open('pers.txt','rU') as h: print '\nrU-display of pers.txt after treatment:\n',h.read()
Если «работа» человека в тексте имела постоянную длину, вы могли бы изменить только ту часть текста, которая соответствует «работе» желаемого человека: это та же идея, что и у отправителя.
Но, по моему мнению, лучше было бы поместить характеристики людей в словарь, записанный в файл с помощью cPickle:
from cPickle import dump, load with open('cards','wb') as f: dump({'Dan':['Warrior',500,1,0],'Jim':['dragonfly',300,2,10],'Somo':['cosmonaut',490,3,65]},f) with open('cards','rb') as g: id_cards = load(g) print 'id_cards before change==',id_cards id_cards['Jim'][0] = 'Wizard' with open('cards','w') as h: dump(id_cards,h) with open('cards') as e: id_cards = load(e) print '\nid_cards after change==',id_cards
источник
Сегодня вечером я практиковался в работе с файлами и понял, что могу опираться на ответ Йохена, чтобы обеспечить большую функциональность для многократного / многократного использования. К сожалению, мой ответ не касается проблемы работы с большими файлами, но упрощает жизнь с файлами меньшего размера.
with open('filetochange.txt', 'r+') as foo: data = foo.readlines() #reads file as list pos = int(input("Which position in list to edit? "))-1 #list position to edit data.insert(pos, "more foo"+"\n") #inserts before item to edit x = data[pos+1] data.remove(x) #removes item to edit foo.seek(0) #seeks beginning of file for i in data: i.strip() #strips "\n" from list items foo.write(str(i))
источник
Это самый простой способ сделать это.
fin = open("a.txt") f = open("file.txt", "wt") for line in fin: f.write( line.replace('foo', 'bar') ) fin.close() f.close()
Надеюсь, у вас это сработает.
источник
# читать строки файла и редактировать определенный элемент
file = open ("pythonmydemo.txt", 'r')
a = file.readlines ()
печать (a [0] [6:11])
a [0] = a [0] [0: 5] + 'Ericsson \ n'
print (a [0])
file = open ("pythonmydemo.txt", 'w')
file.writelines (а)
file.close ()
печать (а)
источник
Предположим, у меня есть файл с таким именем
file_name
:this is python it is file handling this is editing of line
Мы должны заменить строку 2 на «модификация выполнена»:
f=open("file_name","r+") a=f.readlines() for line in f: if line.startswith("rai"): p=a.index(line) #so now we have the position of the line which to be modified a[p]="modification is done" f.seek(0) f.truncate() #ersing all data from the file f.close() #so now we have an empty file and we will write the modified content now in the file o=open("file_name","w") for i in a: o.write(i) o.close() #now the modification is done in the file
источник