web-dev-qa-db-fra.com

Supprimer les lignes vides de CSV?

J'ai un grand fichier csv dans lequel certaines lignes sont entièrement vides. Comment utiliser Python pour supprimer toutes les lignes vides du csv?

Après toutes vos suggestions, c'est ce que j'ai jusqu'à présent

import csv

# open input csv for reading
inputCSV = open(r'C:\input.csv', 'rb')

# create output csv for writing
outputCSV = open(r'C:\OUTPUT.csv', 'wb')

# prepare output csv for appending
appendCSV = open(r'C:\OUTPUT.csv', 'ab')

# create reader object
cr = csv.reader(inputCSV, dialect = 'Excel')

# create writer object
cw = csv.writer(outputCSV, dialect = 'Excel')

# create writer object for append
ca = csv.writer(appendCSV, dialect = 'Excel')

# add pre-defined fields
cw.writerow(['FIELD1_','FIELD2_','FIELD3_','FIELD4_'])

# delete existing field names in input CSV
# ???????????????????????????

# loop through input csv, check for blanks, and write all changes to append csv
for row in cr:
    if row or any(row) or any(field.strip() for field in row):
        ca.writerow(row)

# close files
inputCSV.close()
outputCSV.close()
appendCSV.close()

Est-ce correct ou existe-t-il une meilleure façon de procéder?

19
debugged

Utilisez le module csv:

import csv
...

with open(in_fnam) as in_file:
    with open(out_fnam, 'w') as out_file:
        writer = csv.writer(out_file)
        for row in csv.reader(in_file):
            if row:
                writer.writerow(row)

Si vous devez également supprimer des lignes où tous les champs sont vides, modifiez le if row: ligne vers:

if any(row):

Et si vous souhaitez également traiter les champs qui ne contiennent que des espaces vides, vous pouvez le remplacer par:

if any(field.strip() for field in row):

Notez que dans Python 2.x et versions antérieures, le module csv attendait les fichiers binaires, et donc vous auriez besoin d'ouvrir vos fichiers avec e 'b' drapeau. Dans 3.x, cela entraînera une erreur.

22
Laurence Gonsalves

Vous devez ouvrir un deuxième fichier, y écrire toutes les lignes non vides, supprimer le fichier d'origine et renommer le deuxième fichier en son nom d'origine.

EDIT: une vraie ligne vierge sera comme '\ n':

for line in f1.readlines():
    if line.strip() == '':
        continue
    f2.write(line)

une ligne avec tous les champs vierges ressemblerait à ",\n". Si vous considérez cela comme une ligne vierge:

for line in f1.readlines():
    if ''.join(line.split(',')).strip() == '':
        continue
    f2.write(line)

l'ouverture, la fermeture, la suppression et le renommage des fichiers est laissé comme exercice pour vous. (indice: importation du système d'exploitation, aide (ouverte), aide (os.rename), aide (os.unlink))

EDIT2: Laurence Gonsalves a attiré mon attention sur le fait qu'un fichier csv valide pourrait avoir des lignes vides incorporées dans les champs csv entre guillemets, comme 1, 'this\n\nis tricky',123.45. Dans ce cas, le module csv s'en charge pour vous. Je suis désolée Laurence, ta réponse méritait d'être acceptée. Le module csv répondra également aux préoccupations concernant une ligne comme "","",""\n.

3
Paulo Scardine

code python pour supprimer la ligne vierge du fichier csv sans créer un autre fichier.

def ReadWriteconfig_file (fichier):

try:
    file_object = open(file, 'r')
    lines = csv.reader(file_object, delimiter=',', quotechar='"')
    flag = 0
    data=[]
    for line in lines:
        if line == []:
            flag =1
            continue
        else:
            data.append(line)
    file_object.close()
    if flag ==1: #if blank line is present in file
        file_object = open(file, 'w')
        for line in data:
            str1 = ','.join(line)
            file_object.write(str1+"\n")
        file_object.close() 
except Exception,e:
    print e
2
vaibhav

Surpris que personne ici ne mentionne pandas. Voici une solution possible.

import pandas as pd
df = pd.read_csv('input.csv')
df.to_csv('output.csv', index=False)
2
Sagun Shrestha

Voici une solution utilisant pandas qui supprime les lignes vides.

 import pandas as pd
 df = pd.read_csv('input.csv')
 df.dropna(axis=0, how='all',inplace=True)
 df.to_csv('output.csv', index=False)
1
Aizayousaf

Je dois le faire, mais je n'ai pas de ligne vide écrite à la fin du fichier CSV, comme ce code le fait malheureusement (ce qui est également ce que fait Excel si vous enregistrez-> .csv). Mon code (encore plus simple) utilisant le module CSV le fait aussi:

import csv

input = open("M51_csv_proc.csv", 'rb')
output = open("dumpFile.csv", 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
    writer.writerow(row)
input.close()
output.close() 

M51_csv_proc.csv a exactement 125 lignes; le programme affiche toujours 126 lignes, la dernière étant vide.

J'ai parcouru tous ces fils, rien ne semble changer ce comportement.

1
Gordon Dennis

Le faire avec pandas est très simple. Ouvrez votre fichier csv avec pandas:

import pandas as pd
df = pd.read_csv("example.csv")
#checking the number of empty rows in th csv file
print (df.isnull().sum())
#Droping the empty rows
modifiedDF = df.dropna()
#Saving it to the csv file 
modifiedDF.to_csv('modifiedExample.csv',index=False)
1
Hamza Tayyab

Dans ce script, tous les CR/CRLF sont supprimés d'un fichier CSV puis ont des lignes comme celle-ci:

"My name";[email protected];"This is a comment.
Thanks!"

Exécutez le script https://github.com/eoconsulting/lr2excelcsv/blob/master/lr2excelcsv.py

Résultat (au format Excel CSV):

"My name",[email protected],"This is a comment. Thanks!"
0
Mariano Ruiz