Python 从文件中删除一行
Python deleting a block of lines from a file
我正在努力弄清楚应该如何从文件中删除一行。下面是代码
#!/usr/bin/python
import argparse
import re
import string
##getting user inputs
p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
kkk_list = args.input
def printInFormat(ip, port, name):
formattedText = '''HOST Address:{ip}:PORT:{port}
mode tcp
bind {ip}:{port} name {name}'''.format(ip=ip,
port=port,
name=name)
textWithoutExtraWhitespaces = '\n'.join([line.strip() for line in formattedText.splitlines()])
# you can break above thing
# text = ""
# for line in formattedText.splitlines():
# text += line.strip()
# text += "\n"
return(formattedText)
#####here im writing writing the user inoput to a file and it works great.
#with open("file.txt", "a") as myfile:
# for kkk in kkk_list:
# ip, port, name = re.split(":|,", kkk)
# myfile.write(printInFormat(ip, port, name))
###### here is where im struggling.
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
tobedel = printInFormat(ip, port, name)
f = open("file.txt", "r+")
d = f.readlines()
f.seek(0)
if kkk != "tobedel":
f.write(YY)
f.truncate()
f.close()
如您所见,我在 file.txt 后面附加了用户输入。即(格式:IP:端口:名称)。当脚本执行为 ./script.py 192.168.0.10:80:string 192.168.0.10:80:string
时,文件将包含以下条目
Host Address:192.168.0.10:PORT:80
mode tcp
bind 192.168.0.10:80 abc
Host Address:10.1.1.10:PORT:443
mode tcp
bind 10.1.1.10:443 xyz
现在,当用户以相同方式输入时,我想删除 file.txt 中的行。上面的代码是 运行 没有任何反应。我是初学者,如果您能帮助我理解,我将不胜感激。此问题与
有关
有多种方法可以做到。我试图创建一个新文件,保留所有块。您可以删除旧文件并将新文件重命名为旧文件。
以下是相同的工作代码。
#!/usr/bin/python
import argparse
import re
import string
##getting user inputs
p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
kkk_list = args.input # ['192.168.1.10:80:name1', '172.25.16.2:100:name3']
# returns the next block from the available file. Every block contains 3 lines as per definition.
def getNextBlock(lines, blockIndex):
if len(lines) >= ((blockIndex+1)*3):
line = lines[blockIndex*3]
line += lines[blockIndex*3+1]
line += lines[blockIndex*3+2]
else:
line = ''
return line
# file - holds reference to existing file of all blocks. For efficiency keep the entire content in memory (lines variable)
file = open("file.txt", "r")
lines = file.readlines()
linesCount = len(lines)
# newFile holds reference to newly created file and it will have the resultant blocks after filtering
newFile = open("file_temp.txt","w")
# loop through all inputs and create a dictionary of all blocks to delete. This is done to have efficiency while removing the blocks with O(n) time
delDict = {}
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
tobedel = printInFormat(ip, port, name)
delDict[tobedel] = 1
for i in range(linesCount / 3):
block = getNextBlock(lines, i)
if block in delDict:
print 'Deleting ... '+block
else:
#write into new file
newFile.write(block)
file.close()
newFile.close()
#You can drop the old file and rename the new file as old file
希望对您有所帮助!
让我指出您遗漏的小事。
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
tobedel = printInFormat(ip, port, name)
f = open("file.txt", "r+")
d = f.readlines()
f.seek(0)
if kkk != "tobedel":
f.write(YY)
f.truncate()
f.close()
您在循环内打开文件并在循环外关闭。文件对象超出范围。使用 with
自动为您处理上下文。
在循环中打开文件是个坏主意,因为它会创建很多文件描述符,消耗大量资源。
你写的时候从来没有提到什么是YY
你可以在这里删除行,因为你想一次删除多行,所以d = f.readlines()
应该是d = f.read()
下面是更新后的代码。
#!/usr/bin/python
import argparse
import re
import string
p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
kkk_list = args.input # ['192.168.1.10:80:name1', '172.25.16.2:100:name3']
def getStringInFormat(ip, port, name):
formattedText = "HOST Address:{ip}:PORT:{port}\n"\
"mode tcp\n"\
"bind {ip}:{port} name {name}\n\n".format(ip=ip,
port=port,
name=name)
return formattedText
# Writing the content in the file
# with open("file.txt", "a") as myfile:
# for kkk in kkk_list:
# ip, port, name = re.split(":|,", kkk)
# myfile.write(getStringInFormat(ip, port, name))
with open("file.txt", "r+") as f:
fileContent = f.read()
# below two lines delete old content of file
f.seek(0)
f.truncate()
# get the string you want to delete
# and update the content
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
# get the string which needs to be deleted from the file
stringNeedsToBeDeleted = getStringInFormat(ip, port, name)
# remove this from the file content
fileContent = fileContent.replace(stringNeedsToBeDeleted, "")
# delete the old content and write back with updated one
# f.truncate(0)
f.write(fileContent)
# Before running the script file.txt contains
# HOST Address:192.168.1.10:PORT:80
# mode tcp
# bind 192.168.1.10:80 name name1
#
# HOST Address:172.25.16.2:PORT:100
# mode tcp
# bind 172.25.16.2:100 name name3
# After running file.txt will be empty
# as we have deleted both the entries.
我正在努力弄清楚应该如何从文件中删除一行。下面是代码
#!/usr/bin/python
import argparse
import re
import string
##getting user inputs
p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
kkk_list = args.input
def printInFormat(ip, port, name):
formattedText = '''HOST Address:{ip}:PORT:{port}
mode tcp
bind {ip}:{port} name {name}'''.format(ip=ip,
port=port,
name=name)
textWithoutExtraWhitespaces = '\n'.join([line.strip() for line in formattedText.splitlines()])
# you can break above thing
# text = ""
# for line in formattedText.splitlines():
# text += line.strip()
# text += "\n"
return(formattedText)
#####here im writing writing the user inoput to a file and it works great.
#with open("file.txt", "a") as myfile:
# for kkk in kkk_list:
# ip, port, name = re.split(":|,", kkk)
# myfile.write(printInFormat(ip, port, name))
###### here is where im struggling.
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
tobedel = printInFormat(ip, port, name)
f = open("file.txt", "r+")
d = f.readlines()
f.seek(0)
if kkk != "tobedel":
f.write(YY)
f.truncate()
f.close()
如您所见,我在 file.txt 后面附加了用户输入。即(格式:IP:端口:名称)。当脚本执行为 ./script.py 192.168.0.10:80:string 192.168.0.10:80:string
时,文件将包含以下条目Host Address:192.168.0.10:PORT:80
mode tcp
bind 192.168.0.10:80 abc
Host Address:10.1.1.10:PORT:443
mode tcp
bind 10.1.1.10:443 xyz
现在,当用户以相同方式输入时,我想删除 file.txt 中的行。上面的代码是 运行 没有任何反应。我是初学者,如果您能帮助我理解,我将不胜感激。此问题与
有多种方法可以做到。我试图创建一个新文件,保留所有块。您可以删除旧文件并将新文件重命名为旧文件。 以下是相同的工作代码。
#!/usr/bin/python
import argparse
import re
import string
##getting user inputs
p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
kkk_list = args.input # ['192.168.1.10:80:name1', '172.25.16.2:100:name3']
# returns the next block from the available file. Every block contains 3 lines as per definition.
def getNextBlock(lines, blockIndex):
if len(lines) >= ((blockIndex+1)*3):
line = lines[blockIndex*3]
line += lines[blockIndex*3+1]
line += lines[blockIndex*3+2]
else:
line = ''
return line
# file - holds reference to existing file of all blocks. For efficiency keep the entire content in memory (lines variable)
file = open("file.txt", "r")
lines = file.readlines()
linesCount = len(lines)
# newFile holds reference to newly created file and it will have the resultant blocks after filtering
newFile = open("file_temp.txt","w")
# loop through all inputs and create a dictionary of all blocks to delete. This is done to have efficiency while removing the blocks with O(n) time
delDict = {}
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
tobedel = printInFormat(ip, port, name)
delDict[tobedel] = 1
for i in range(linesCount / 3):
block = getNextBlock(lines, i)
if block in delDict:
print 'Deleting ... '+block
else:
#write into new file
newFile.write(block)
file.close()
newFile.close()
#You can drop the old file and rename the new file as old file
希望对您有所帮助!
让我指出您遗漏的小事。
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
tobedel = printInFormat(ip, port, name)
f = open("file.txt", "r+")
d = f.readlines()
f.seek(0)
if kkk != "tobedel":
f.write(YY)
f.truncate()
f.close()
您在循环内打开文件并在循环外关闭。文件对象超出范围。使用
with
自动为您处理上下文。在循环中打开文件是个坏主意,因为它会创建很多文件描述符,消耗大量资源。
你写的时候从来没有提到什么是
YY
你可以在这里删除行,因为你想一次删除多行,所以
d = f.readlines()
应该是d = f.read()
下面是更新后的代码。
#!/usr/bin/python
import argparse
import re
import string
p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
kkk_list = args.input # ['192.168.1.10:80:name1', '172.25.16.2:100:name3']
def getStringInFormat(ip, port, name):
formattedText = "HOST Address:{ip}:PORT:{port}\n"\
"mode tcp\n"\
"bind {ip}:{port} name {name}\n\n".format(ip=ip,
port=port,
name=name)
return formattedText
# Writing the content in the file
# with open("file.txt", "a") as myfile:
# for kkk in kkk_list:
# ip, port, name = re.split(":|,", kkk)
# myfile.write(getStringInFormat(ip, port, name))
with open("file.txt", "r+") as f:
fileContent = f.read()
# below two lines delete old content of file
f.seek(0)
f.truncate()
# get the string you want to delete
# and update the content
for kkk in kkk_list:
ip, port, name = re.split(":|,", kkk)
# get the string which needs to be deleted from the file
stringNeedsToBeDeleted = getStringInFormat(ip, port, name)
# remove this from the file content
fileContent = fileContent.replace(stringNeedsToBeDeleted, "")
# delete the old content and write back with updated one
# f.truncate(0)
f.write(fileContent)
# Before running the script file.txt contains
# HOST Address:192.168.1.10:PORT:80
# mode tcp
# bind 192.168.1.10:80 name name1
#
# HOST Address:172.25.16.2:PORT:100
# mode tcp
# bind 172.25.16.2:100 name name3
# After running file.txt will be empty
# as we have deleted both the entries.