Как я могу удалить строки "\ n" из файла в Python? - PullRequest
0 голосов
/ 20 мая 2019

Мне нужно проверить, заканчивается ли файл .csv, с которым я работаю, строкой больше 1 "\n".Если он находит больше, чем пустую строку, он удаляет их все, кроме одной.

Мой код:

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"))

Файл .csv похож на ['01-01-2019,0,0,0\n', '18-05-2019,33,31,48\n', '\n', '\n', '\n'] и вывод I'* хотел бы это ['01-01-2019,0,0,0\n', '18-05-2019,33,31,48\n', '\n'], но он не может удалить ни одной строки.

Ответы [ 4 ]

1 голос
/ 20 мая 2019

Ой, никогда не переписывайте файл, который вы читаете: он, вероятно, не будет работать или в лучшем случае приведет к кошмару обслуживания.

Если файл достаточно мал, чтобы поместиться в основной памяти, это небольшоеизменения в вашем коде может быть достаточно:

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
1 голос
/ 20 мая 2019

Самый простой способ - отслеживать, если вы видели пустую строку, а затем написать одну непосредственно перед тем, как написать не -пустую строку.

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

Это сокращает любую последовательность пустых строк до одной пустой строки и записывает эту одну строку непосредственно перед записью непустой строки или конца файла.Когда pre - пустая строка, запись не допускается.

Если вы хотите сохранить несколько пустых строк в середине файла, создайте последовательность пустых строк в pre какВы найдете их, и в конце файла пишите только одну пустую строку (а не pre сама), если pre не пусто.

pre = ""
for line in lines:
    if line == "\n":
        pre += line
    else:
        op.write(pre)
        op.write(line)
        pre = ""
if pre:
    op.write("\n")
0 голосов
/ 20 мая 2019

Мне удалось разобраться с этим кодом:

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

Он может удалить каждую новую строку в избытке, независимо от того, где она находится в файле.

Спасибо всем, кто пытался мне помочь!

0 голосов
/ 20 мая 2019

Вы можете попробовать использовать 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())
...