删除现有文件的内容并重新写入内容
Delete content of existing file and write again the content
专家,这个问题很常见,我已经根据SO中的解决方案和示例进行了尝试,但仍然无法将我所有的设备打印输出写入一个文件。我使用多种方法进行了测试,大多数时候我的文本文件中只有最后一行输出。
下面的问题和我的几乎一样......但我运气不好。
我根据设备类型测试脚本 运行 特定命令。如果设备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
我真的希望有人能帮助我.. 请协助。谢谢。
以模式 'w'
打开会截断文件(如果存在),而模式 'a'
将附加到它。
你的问题是你正在为每一行输出以模式'w'
重新打开文件。每次你重新打开文件,你破坏之前的内容。
这个问题有两种解决方法:
- 首选解决方案是在您的脚本中打开文件 一次 并使用现有文件句柄向其写入多行,而不是为每行打开一个新文件句柄输出行。
- 您也可以在脚本的开头使用
'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()
如何格式化它的输出。
专家,这个问题很常见,我已经根据SO中的解决方案和示例进行了尝试,但仍然无法将我所有的设备打印输出写入一个文件。我使用多种方法进行了测试,大多数时候我的文本文件中只有最后一行输出。 下面的问题和我的几乎一样......但我运气不好。
我根据设备类型测试脚本 运行 特定命令。如果设备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
我真的希望有人能帮助我.. 请协助。谢谢。
以模式 'w'
打开会截断文件(如果存在),而模式 'a'
将附加到它。
你的问题是你正在为每一行输出以模式'w'
重新打开文件。每次你重新打开文件,你破坏之前的内容。
这个问题有两种解决方法:
- 首选解决方案是在您的脚本中打开文件 一次 并使用现有文件句柄向其写入多行,而不是为每行打开一个新文件句柄输出行。
- 您也可以在脚本的开头使用
'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()
如何格式化它的输出。