Remove blank lines in a csv

2

I'm trying to remove empty rows from a csv document:

Document:

  

sentence, lingua

     

., pt

     

., in

     

., in

     

., it

     

., en

     

., pt

     

., pt

     

., en

     

., pt

     

., pt

     

"it's not expensive", in

     

"almost 50 euros the carpet is expensive", is

     

"price should download !!", pt

     

"new prices please! ??", pt

My script:

import csv
import string

with open ("test.csv", "r") as f:
    csvfile = csv.reader(f, delimiter = ',')

    for line in csvfile:
        if line[1] == 'pt':
            frases = " ".join(line[0].lower().split()) 
            removePunct = "".join(word for word in mails if word not in string.punctuation)
            noEmptyLines = " ".join(lines for lines in removePunct if len(lines) != 0)

    print (noEmptyLines)

The expected result:

  

Price should download

     

new prices please

My result:

  

n o v o s p r o c e s p o r f e r o v e r

    
asked by anonymous 25.06.2018 / 11:52

2 answers

2
for line in csvfile:
    if line[1] == 'pt':
        # Nesta linha, tomo a primeira coluna da linha do ficheiro CSV
        # troco a caixa das letras para minúscula e parto cada palavra
        # (atenção ao ' ', que é o caracter de partição), formando uma 
        # nova lista
        frase = line[0].lower().split(' ')

        novaspalavras = []
        for word in frase:

            # Nesta linha, tomo cada caracter da (palavra) variável 'word', 
            # contida em 'frase', comparo se é caracter de pontuação e, caso
            # não o seja, o caracter em questão é 'yieldado' para dentro
            # de uma lista de caracteres que, por sua vez, é tomada
            # pela função join de uma string vazia, ou seja,
            # a palavra será recomposta com "caracteres" de separação
            # vazios, tal como descrito na string que invoca join.
            novapalavra = "".join(char for char in word 
                        if char not in set(string.punctuation))

            if len(novapalavra) > 0:
                novaspalavras.append(novapalavra)

        # Nesta linha, recomponho a frase, emendando cada palavra com
        # strings " ", ou seja, espaços, intercalantes entre palavras
        # da lista.
        novafrase = " ".join(novaspalavras)

        # Nesta linha, caso a novafrase não seja vazia, ela é imprimida.
        if len(novafrase) > 0:
            print (novafrase)
    
25.06.2018 / 14:22
0

Good morning,

Given the "document" and example code, in this excerpt:

if line[1] == 'pt':
    ...

An exception of type IndexError would be raised to the blank lines contained in the document.

The other point that interferes with your expected result is that at the end of loop for you make another join and as strings in python are iterate join goes through each character of the string and joins them together with a space.

The code below covers these two points of failure that I have, and I believe it should work as intended.

with open("example.csv", "r") as f:
csvfile = csv.reader(f, delimiter=",")
for l in csvfile:
    if len(l) and l[-1] == "pt":
        if len(l[0]) > 1:
            removePunct = "".join(char for char in l[0] if char not in string.punctuation)
            print(removePunct)

I hope to have helped, and any doubts as to the solution I am at your disposal!

    
25.06.2018 / 15:04