Удалить содержимое существующего файла и снова записать содержимое - PullRequest
0 голосов
/ 20 октября 2019

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

Как удалить содержимое файла перед записью в него в скрипте Python?

Я тестирую скрипт для запуска конкретной команды в зависимости от типа устройства. Если устройства A запускают команду A, если устройства B запускают команду B, если устройство C запускает команду c. Список устройств в текстовом файле (список имеет тип и IP-адрес). Когда я использую 'w' содержимое файла только в последней строке, но когда я использую 'a', он сохранит все содержимое всех устройств в списке, но когда я снова запусту скрипт, он продолжит писать по последнему указателю итаким образом, я получил дублированный контент. содержимое в первый раз запускает скрипт следующим образом

OUTPUT CONTENT for device type A IP 192.168.100.100
OUTPUT CONTENT for device type A IP 192.168.100.110
OUTPUT CONTENT for device type B IP 10.1.10.100
OUTPUT CONTENT for device type C IP 10.2.10.10
OUTPUT CONTENT for device type C IP 10.2.10.11
OUTPUT CONTENT for device type C IP 10.2.10.12

при запуске скрипта второй раз ... файл содержит дубликаты следующим образом

OUTPUT CONTENT for device type A IP 192.168.100.100
OUTPUT CONTENT for device type A IP 192.168.100.110
OUTPUT CONTENT for device type B IP 10.1.10.100
OUTPUT CONTENT for device type C IP 10.2.10.10
OUTPUT CONTENT for device type C IP 10.2.10.11
OUTPUT CONTENT for device type C IP 10.2.10.12
OUTPUT CONTENT for device type A IP 192.168.100.100
OUTPUT CONTENT for device type A IP 192.168.100.110
OUTPUT CONTENT for device type B IP 10.1.10.100
OUTPUT CONTENT for device type C IP 10.2.10.10
OUTPUT CONTENT for device type C IP 10.2.10.11
OUTPUT CONTENT for device type C IP 10.2.10.12

скрипт выглядит следующим образом

#Define functions for each device_type
def type_A(ip):
    return{
        'device_type': 'A',
        'ip': ip,
        'username': 'usr10',
        'password': 'password',
        }

def type_B(ip):
    return{
        'device_type': 'B',
        'ip': ip,
        'username': 'usr10',
        'password': 'password',
        }

def type_C(ip):
    return{
        'device_type': 'C',
        'ip': ip,
        'username': 'usr10',
        'password': 'password',
        }

#Function to create output text file
def writeOutFile(outFileName, string):
    with open(outFileName, "w") as f:
       outfile = f.write(string)

#Open Text file that contain device type and ip address
deviceFile = open('devices.txt','r')

#Create list llist for each line in the file.  
#The first item is the device type, 
#The second item is the IP address
for line in deviceFile:
    llist = line.split()
    ipAd = llist[1]

    #Check the first item of the list to determine device type and set 
    #variables
    if llist[0] == 'A':
        dvs = type_A(ipAd)
        sendCommand = 'command for device type A'
    elif llist[0] == 'B':
        dvs = type_B(ipAd)
        sendCommand = 'command for device type B'
    elif llist[0] == 'C':
        dvs = type_C(ipAd)
        sendCommand = 'command for device type c'
    else:
        print("no valid device type")
        break

    dvs_connect = ConnectHandler(**dvs)
    sendCommand = (dvs_connect.send_command(sendCommand))
    #This print all the devices output on the terminal
    print(sendCommand)

    #Generate output file
    outFileName = "outputFile.txt"

    #function call to write the output string into a text file
    writeOutFile(outFileName, sendCommand)

    dvs_connect.disconnect()

deviceFile.close()

devices.txt list

A 192.168.100.100
A 192.168.100.110
B 10.1.10.100
C 10.2.10.10
C 10.2.10.11
C 10.2.10.12

outputFile.txt Выходной файл содержит только содержимое последней строки ... содержимое A и B уже перезаписано.

OUTPUT CONTENT for device type C IP 10.2.10.12

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

OUTPUT CONTENT for device type A IP 192.168.100.100
OUTPUT CONTENT for device type A IP 192.168.100.110
OUTPUT CONTENT for device type B IP 10.1.10.100
OUTPUT CONTENT for device type C IP 10.2.10.10
OUTPUT CONTENT for device type C IP 10.2.10.11
OUTPUT CONTENT for device type C IP 10.2.10.12

Я действительно надеюсь, что кто-нибудь может мне помочь .. пожалуйста, помогите. Спасибо.

1 Ответ

1 голос
/ 20 октября 2019

Открытие в режиме 'w' усекает файл, если он существует, а режим 'a' добавляет к нему.

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

Существует два решения этой проблемы:

  1. ПредпочтительныйРешением было бы открыть файл один раз в вашем скрипте и использовать существующий дескриптор файла для записи в него нескольких строк вместо открытия нового дескриптора файла для каждой строки вывода.
  2. Youтакже можно открыть файл один раз с режимом 'w' в начале вашего скрипта, а затем использовать режим 'a' (но это уже взлом).

Один из способов реализовать первыйможно открыть файл непосредственно перед основным циклом:

with open("outputFile.txt", "w") as f:
    for line in deviceFile:
        # ...

        # Replace this line:
        # writeOutFile(outFileName, sendCommand)
        # With this one:
        f.write(sendCommand)

Вам может потребоваться добавить новую строку ("\n") к этой строке перед ее записью;Я не вижу, как dvs_connect.send_command() форматирует вывод.

...