Поиск и замена строки внутри .txt файла с пользовательским вводом - PullRequest
0 голосов
/ 19 декабря 2018

Справочная информация : Я пытаюсь автоматизировать некоторые части рабочего процесса.Шаги, которые я предпринимаю вручную: я получаю билет для изменения идентификатора в текстовом файле.Я должен пройти через общую сетевую папку, создать резервную копию файла, поместить скопированный файл в папку архива и отредактировать существующий файл с идентификатором из заявки.

То, что я пытаюсь создать : небольшая программа, которая спросит меня, какой идентификатор я хочу изменить (в текстовом файле есть уже существующие идентификаторы), а затем перейдет внутрьфайл и найти совпадение.Затем я хочу, чтобы программа спросила меня, на что я хочу изменить идентификатор.Я хочу, чтобы программа отредактировала существующий файл с моим вводом, сохранила его, затем закрыла.

Пока у меня есть следующий код, который завершает первую часть (копирование файла и помещение его в папку архива),У меня есть вторая функция, на которой я застрял.Я знаю, что вторая функция не работает, но хотел бы получить от других информацию о том, что, по их мнению, я должен попробовать.Я видел модуль fileinput, но я прочитал, что это не лучший модуль, и я должен попытаться запрограммировать его без модуля fileinput.

Код :

import shutil
import datetime
import os
import fileinput

original_file = "\\network\\path\\to\\file"

def date_rename_file():
    todays_date = datetime.datetime.now()
    stripped_time = todays_date.strftime('%Y%m%d')    
    shutil.copyfile(original_file, "\\network\\path\\to\\backupfolder\\device_"+str(stripped_time)+".txt")

def device_id_replace():
    original_id = input("What device ID are you needing to replace?")
    new_id = input("What is the new device ID?")
    with open(original_file, 'w') as devicetxt:
        for line in devicetxt:
            print(line)
            if original_id in line:
                print("Found "+original_id)

date_rename_file()
device_id_replace()

Спасибо, не стесняйтесь сносить мой код :) Я все еще учусь и буду благодарен за любой вклад.Кроме того, не стесняйтесь, дайте мне знать, если я пропустил любую соответствующую информацию!

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Вы можете попробовать это:

def device_id_replace():
    original_id = input("What device ID are you needing to replace?")
    new_id = input("What is the new device ID?")
    with open(original_file, 'r+') as devicetxt: #r+ is for read and write
        string = devicetxt.read() #read into one string
        string = string.replace(original_id, new_id) #replacement
        devicetxt.truncate(0) #To clear contents of file before writeback
        devicetxt.seek(0) #Put the file's current position at 0
        devicetxt.write(string) #writeback to file

Также рекомендуется передавать original_file в виде строки в функции.См. Отредактированный код ниже:

import shutil
import datetime
import os
import fileinput

original_file = "\\network\\path\\to\\file"

def date_rename_file(filepath):
    todays_date = datetime.datetime.now()
    stripped_time = todays_date.strftime('%Y%m%d')    
    shutil.copyfile(filepath, "\\network\\path\\to\\backupfolder\\device_"+str(stripped_time)+".txt")

def device_id_replace(filepath):
    original_id = input("What device ID are you needing to replace?")
    new_id = input("What is the new device ID?")
    with open(filepath, 'r+') as devicetxt: #r+ is for read and write
        string = devicetxt.read() #read into one string
        string = string.replace(original_id, new_id) #replacement
        devicetxt.truncate(0) #To clear contents of file before writeback
        devicetxt.seek(0) #Put the file's current position at 0
        devicetxt.write(string) #writeback to file

date_rename_file(original_file)
device_id_replace(original_file)
0 голосов
/ 19 декабря 2018

Попробуйте это:

original_file = ""\\network\\path\\to\\file""

def device_id_replace(filepath):                   
    original_id = input("What device ID are you needing to replace?") 
    new_id = input("What is the new device ID?")   
    with open(filepath, 'r') as devicetxt:
        new_content = []
        for line in devicetxt:
            new_content.append(line.replace(original_id, new_id))
    with open(filepath, "w") as devicetxt:
        for line in new_content:
            devicetxt.write(line)

device_id_replace(original_file)

Ответ @ycx не работал в прошлом.Поэтому я исправил твой старый код:

original_file = "test.txt"


def device_id_replace(filepath):
    original_id = input("What device ID are you needing to replace?")
    new_id = input("What is the new device ID?")
    with open(filepath, 'r+') as devicetxt: #r+ is for read and write
        contents = devicetxt.readlines() #put all lines into a list
        for line_i, line in enumerate(contents):
            if original_id in line:
                contents[line_i] = line.replace(original_id, new_id) # CHANGED LINE
        devicetxt.truncate(0)
        devicetxt.seek(0)
        devicetxt.writelines(contents) #writeback to file

device_id_replace(original_file)
0 голосов
/ 19 декабря 2018

У вас есть несколько вариантов здесь: либо используйте внутренний инструмент, например sed, если вы используете Unix / Unix-подобный, либо создайте новый файл поверх старого.

  1. Прочитайте всефайл.
  2. Заменить вхождения.
  3. Переписать все строки.

Эта версия Pythonic

with open(filepath) as f:
    transformedLines = [line.replace(old, new) if (old in line) else (line) for line in f]
with open(filepath, 'w') as f:
    f.writelines(transformedLines);

Менее Pythonic версия похожа:

transformedLines = []
with open(filepath) as f:
    for line in f:
        if old in line:
            transformedLines.append(line.replace(old, new))
        else:
            transformedLines.append(line)

Функциональный способ (хотя и очень неэффективный) может быть реализован с помощью карты:

    transformedLines = list(map(lambda line : line.replace(old, new), f.readlines()))

Это будет хорошо, если ваш файл не большой, иначе вам придется подуматьоб использовании другого типа хранилища данных, например, БД.

В данный момент ваш подход работает хорошо, но вы захотите открыть его в режиме чтения, для каждой строки добавьте его в новый список, если ваш идентификатор равеннайдено добавить новую строку вместо.

Записать новый массив в файл, открытый в режиме записи, что приведет к удалению содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...