简体   繁体   中英

Trying to delete lines in a text file that contain a specific character

I'm testing the code below, but it doensn't do what I would like it to do.

delete_if = ['#', ' ']
with open('C:\\my_path\\AllDataFinal.txt') as oldfile, open('C:\\my_path\\AllDataFinalFinal.txt', 'w') as newfile:
    for line in oldfile:
        if not any(del_it in line for del_it in delete_if):
            newfile.write(line)
print('DONE!!')

Basically, I want to delete any line that contains a '#' character (the lines I want to delete start with a '#' character). Also, I want to delete any/all lines that are completely blank. Can I do this in on go, by reading through items in a list, or will it require several passes through the text file to clean up everything? TIA.

It's easy. Check my code below :

filePath = "your old file path"
newFilePath = "your new file path"

# we are going to list down which lines start with "#" or just blank
marker = []

with open(filePath, "r") as file:
    content = file.readlines() # read all lines and store them into list

for i in range(len(content)): # loop into the list
    if content[i][0] == "#" or content[i] == "\n": # check if the line starts with "#" or just blank
        marker.append(i) # store the index into marker list

with open(newFilePath, "a") as file:
    for i in range(len(content)): # loop into the list
        if not i in marker: # if the index is not in marker list, then continue writing into file
            file.writelines(content[i]) # writing lines into file

The point is, we need to read all the lines first. And check line by line whether it starts with # or it's just blank. If yes, then store it into a list variable. After that, we can continue writing into new file by checking if the index of the line is in marker or not.

Let me know if you have problem.

How about using the ternary operator?

 #First option: within your for loop
 line = "" if "#" in line or not line else line

 #Second option: with list comprehension
 newFile = ["" if not line or "#" in line else line for line in oldfile]

I'm not sure if the ternary would work because if the string is empty, an Exception should be shown because "#" won't be in an empty string... How about

#Third option: "Staging your conditions" within your for loop
#First, make sure the string is not empty
if line:
    #If it has the "#" char in it, delete it
    if "#" in line:
        line = ""
#If it is, delete it
else: 
    line = ""

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM