Найти - Пользователи
Полная версия: Замена слова в файле.
Начало » Python для новичков » Замена слова в файле.
1 2
Dmitriy_Z
AD0DE412
Сейчас не могу проверить. Не заменит ли этот код другие слова “00000” в файле ?
AD0DE412
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')
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[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')
Dmitriy_Z
AD0DE412
Не заменит ли этот код остальные слова “0000” в файле? Замена нужно только в одном месте
AD0DE412
ну и …

запустить не можете?

зы мое личное мнение вот ежеле у вас есть структурированные данные и все всерьез и на долго
то создавайте класс с описанем этих данных и методы к ним (set, get, export, import …) ну а дальше ООП и все такое
doza_and
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)
  • Если вы так напишете это сразу выдаст в вас непрофессионала. Код не следует PEP8 нет пустых строк и пробелчиков. Его сложно читать.
  • Этот код ужасен потому что в одной строке тут смешивается и open и read Две совершенно разные функции.
  • Оно все мгновенно сломается если файл большой и не влезет в оперативную память.
  • Тут не закрываются файловые дескрипторы. Если вы в коде сделаете так тысячи раз подряд то исчерпаете ресурсы. Может быть.
  • Тут программист вообще не указал кодировку файла, которую должен был уточнить у заказчика. Это чревато проблемами при переносе win/unix
  • Регулярка показывает слабые знания программиста. он пишет 00000 вместо более короткого (можно сэкономить одну букву) и легко читаемого:
     "0{5}"
    
  • Алгоритм опирается на то что нужные строки строки начинаются с 1,2 Этого не было в ТЗ, поэтому на это нельзя опираться.
  • Наконец просто выбран неподходящий инструмент. Гораздо лучший выбор awk,perl
Если найдете еще недостатки то дописывайте. ТС это будет полезно.
AD0DE412
не плохо было бы параметры формализации данных знать

doza_and
Гораздо лучший выбор awk,perl

не факт
вы же не знаете какие ТС лимиты и приоритеты
а вообще это все контрфактуално
py.user.next
Тут свой вариант с проверкой ошибок.
  
#!/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()
Dmitriy_Z
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')




Спасибо. Помогло.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB