简体   繁体   中英

How can I delete “\n” lines from a file in Python?

I need to check if the .csv file I'm working with ends with more than 1 "\\n" line. If it finds more than a blank line, it removes them all but one.

My code is:

import os
from pathlib import Path


def remove_blanks():
    dirname = os.path.dirname(os.path.abspath(__file__))
    path: Path = Path(os.path.join(dirname, "data.csv"))
    with open(path, "r+") as op:
        lines = op.readlines()
        for line in lines:
            if line == "\n":
                op.write(line.rstrip("\n"))

The .csv file is something like ['01-01-2019,0,0,0\\n', '18-05-2019,33,31,48\\n', '\\n', '\\n', '\\n'] and the output I'd want is ['01-01-2019,0,0,0\\n', '18-05-2019,33,31,48\\n', '\\n'] but it doesn't seem to be able to delete any line.

The simplest way would be to keep track if you've seen an empty line, then write one just before you write a non -empty line.

pre = ""
for line in lines:
    if line == "\n":
        pre = line
    else:
        op.write(pre)
        op.write(line)
        pre = "\n"
op.write(pre)

This reduces any sequence of empty lines to a single empty line, and writes that single line just before writing a non-empty line or the end of the file. When pre is the empty string, writing it is a no-op.

If you want to preserve multiple blank lines in the middle of the file, build up the sequence of blank lines in pre as you find them, and at the end of the file, only write a single blank line (rather than pre itself) if pre is not empty.

pre = ""
for line in lines:
    if line == "\n":
        pre += line
    else:
        op.write(pre)
        op.write(line)
        pre = ""
if pre:
    op.write("\n")

Oops, never rewrite the file that you are reading: it is likely not to work or at best will lead to a maintenance nightmare.

If the file is small enough to fit in main memory, this slight change in your code could be enough:

import os.path
from pathlib import Path


def remove_blanks():
    dirname = os.path.dirname(os.path.abspath(__file__))
    path: Path = Path(os.path.join(dirname, "data.csv"))
    with open(path, "r") as op:
        lines = op.readlines()  # read lines in memory
    with open(path("w") as op:  # re-write everything from the beginning
        flag = False     
        for line in lines:
            if line == "\n":
                if not flag:
                    op.write(line)
                flag = True
            else:
                op.write(line)
                # flag = False  # uncomment if you want to keep one blank line 
                                # per group of consecutive lines

You could try using the Counter() .

import os
from pathlib import Path
from collections import Counter

def remove_blanks():
    dirname = os.path.dirname(os.path.abspath(__file__))
    path: Path = Path(os.path.join(dirname, "data.csv"))
    with open(path, "r+") as op:
        lines = op.readlines()
        for line in lines:
            count = Counter()
            # Add 1 for every time word appears in line
            for word in line:
                count[word] += 1
            # Change the number of newlines to 1
            if count['\n'] > 1:
                count['\n'] = 1
            # Returns list with the number of elements
            line = list(count.elements())

I managed to work this out, with this code:

import os
from pathlib import Path


def remove_blanks():
    dirname = os.path.dirname(os.path.abspath(__file__))
    path: Path = Path(os.path.join(dirname, "data.csv"))
    with open(path, "r") as op:
        lines = op.readlines()  # read lines in memory
    with open(path, "w") as op: # re-write everything from the beginning
        for line in lines:
            if line != "\n":
                op.write(line)
            else:
                continue

It can remove every new line in excess, no matter where it is in the file.

Thanks to everyone who tried to help me!

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