AD0DE412Сейчас не могу проверить. Не заменит ли этот код другие слова “00000” в файле ?
AD0DE412Сейчас не могу проверить. Не заменит ли этот код другие слова “00000” в файле ?
Dmitriy_Zа то … я вам гарантирую это …
Не заменит ли этот код другие слова “00000” в файле ?
def one(fd, seq): file = open(fd, 'r') cout = 0 try: while file: str1 = file.readline() str2 = file.readline() str3 = file.readline() tmp = str3.split(" ") if tmp[1] == "0"*5 and cout in seq: tmp[1] = str2.split(" ")[1][:5] str3 = " ".join(tmp) yield str1 yield str2 yield str3 cout += 1 except IndexError: print('Check up the entered data!!!') except Exception as err: print(err) file.close() print(*one('in.txt', [1, 2])) def two(seq, fd): file = open(fd, 'w') for i in seq: file.writelines(i) file.close() two(one('in.txt', [1]), 'out.txt')
import re import time def func(file_open:str,file_new:str=None): ''' функция сделана для частного случая :param file_open:путь к исходному файлу :param file_new: путь к новому файлу :return: "ок" ''' target1 = r'(?<=^1\s)\d{5}'# это выбираем target2 = r'(?<=^2\s)\d{5}'# вместо этого вставляем copy = None sec = int(time.time()) if file_new is None:# название сохраняемого файла по умолчанию file_new = f'new_data_{sec}.txt' with open(file_new,'a') as new_file: with open(file_open,'r') as file: strings = file.readlines() for s in strings: search = re.findall(target1,s) if search: copy = search[0] if copy is not None: s = re.sub(target2,copy,s) new_file.writelines(s) return "ok" func('temp_data.txt','new_file.txt')
AD0DE412Не заменит ли этот код остальные слова “0000” в файле? Замена нужно только в одном месте
AD0DE412:):):) Ого! А чего это вы все тут делаете?
и все всерьез и на долго
то создавайте класс с описанем
import re data = open("data.txt","r").read() res = re.sub(r"^(1 (\d+)(.+)\n2 )00000",r"\1\2",data,flags=re.M) open("data1.txt","w").write(res)
"0{5}"
Гораздо лучший выбор awk,perl
#!/usr/bin/env python3 # Заменяет в формализованном файле поле "00000" на соответствующее # числовое значение соответствующего поля из предыдущей строки. # # Файл представляет собой список, где формат записи повторяется каждые # 3 строки. # Исходный текст: # BY70-1 # 1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006 # 2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465 # BY70-2 # 1 45858U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006 # 2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465 # Результат: # BY70-1 # 1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006 # 2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465 # BY70-2 # 1 45858U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006 # 2 45858 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465 def translate(istream, ostream): state = 1 while True: line = istream.readline() if not line: break if state == 1: ostream.write(line) state = 2 elif state == 2: saved_field = line.split(' ', 2)[1][:5] if not saved_field.isdigit(): raise ValueError('field should be a number: ' + saved_field) ostream.write(line) state = 3 elif state == 3: split_line = line.split(' ') field = split_line[1] if field != '00000': raise ValueError('field should have value 00000: ' + field) split_line[1] = saved_field newline = ' '.join(split_line) ostream.write(newline) state = 1 def process(ifname, ofname): with open(ifname, 'r', encoding='utf-8') as fin, \ open(ofname, 'w', encoding='utf-8') as fout: translate(fin, fout) def main(): ifname = 'input.txt' ofname = 'output.txt' process(ifname, ofname) if __name__ == '__main__': main()
xam1816
import re
import time
def func(file_open:str,file_new:str=None):
‘'’
функция сделана для частного случая
:param file_open:путь к исходному файлу
:param file_new: путь к новому файлу
:return: “ок”
‘'’
target1 = r'(?<=^1\s)\d{5}'# это выбираем
target2 = r'(?<=^2\s)\d{5}'# вместо этого вставляем
copy = None
sec = int(time.time())
if file_new is None:# название сохраняемого файла по умолчанию
file_new = f'new_data_{sec}.txt'
with open(file_new,'a') as new_file:
with open(file_open,'r') as file:
strings = file.readlines()
for s in strings:
search = re.findall(target1,s)
if search:
copy = search
if copy is not None:
s = re.sub(target2,copy,s)
new_file.writelines(s)
return “ok”
func('temp_data.txt','new_file.txt')