删除现有文件的内容,然后再次写入内容

问题描述 投票:0回答:1

专家,问题很常见,我已经根据SO中的解决方案和示例进行了尝试,但是仍然无法将我所有设备的打印输出写入文件。我已经使用几种方法进行了测试,大多数时候我的文本文件中只有最后一行输出。下面的问题几乎和我的一样...但是对我来说没有运气。

How to delete the contents of a file before writing into it in a python script?

我测试脚本以根据设备类型运行特定命令。如果设备A运行命令A,如果设备B运行命令B,如果设备C运行命令c。文本文件中的设备列表(列表中包含类型和IP地址)。当我使用'w'时,文件仅包含最后一行,但是当我使用'a'时,它将保存列表中所有设备的所有内容,但是当我再次运行脚本时,它将继续写在最后一个指针上,并且因此我得到了重复的内容..它追加并保持追加。

使用outFileName时,“ w”输出内容仅取最后一行内容

OUTPUT CONTENT for device type C IP 10.2.10.12

使用outFileName时,“ 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列表

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

我希望运行脚本多少次,它将覆盖文本文件的现有内容,但不会重复...如果我的devices.txt列表中有6个设备,这意味着我应该有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

我真的希望有人可以帮助我。谢谢。

python overwrite file-writing erase
1个回答
0
投票

以模式'w'打开会截断文件(如果存在),而模式'a'将附加到该文件。

您的问题是对于输出的每一行都以'w'模式重新打开文件。每次重新打开文件时,都会破坏以前的内容。

对此问题有两种解决方案:

  1. 首选解决方案是在脚本中打开文件[[once,并使用现有的文件句柄向其中写入多行,而不是为输出的每一行打开一个新的文件句柄。
  2. 您也可以在脚本的开头以'w'模式打开一次文件,然后从此以后使用'a'模式(但这是hack)。
  • 实现第一个选项的一种方法是在主循环之前打开文件:

    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()如何格式化其输出。
  • © www.soinside.com 2019 - 2024. All rights reserved.