Supprimer les lignes vides de CSV?
j'ai un gros fichier csv dans lequel certaines lignes sont entièrement vide. Comment puis-je 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 est-il une meilleure façon de le faire?
5 réponses
csv
module:
import csv
...
input = open(in_fnam, 'rb')
output = open(out_fnam, 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
if row:
writer.writerow(row)
input.close()
output.close()
Si vous devez également supprimer les lignes où tous les champs sont vides, changer if row:
ligne:
if any(row):
et si vous voulez aussi traiter comme vides les champs qui ne sont constitués que de blancs, vous pouvez les remplacer par:
if any(field.strip() for field in row):
code python pour supprimer la ligne vide 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
vous devez ouvrir un second fichier, y écrire toutes les lignes non blanches, supprimer le fichier original et renommer le second fichier au nom original.
EDIT: une vraie ligne blanche sera comme '\n':
for line in f1.readlines():
if line.strip() == '':
continue
f2.write(line)
une ligne avec tous les champs vides ressemblerait ',,,,,\n'. Si vous considérez que c'est une ligne vide:
for line in f1.readlines():
if ''.join(line.split(',')).strip() == '':
continue
f2.write(line)
ouvrir, fermer, supprimer et renommer les fichiers est laissé comme un exercice pour vous. (indice: importer os, help(ouvrir), help (os.renommer), de l'aide(système d'exploitation.délier))
EDIT2: Laurence Gonsalves a attiré mon attention sur le fait qu'un fichier csv valide pourrait avoir des lignes vierges intégrées dans des champs csv cités, comme 1, 'this\n\nis tricky',123.45
. Dans ce cas, le module csv s'occupera de cela pour vous. Je suis désolé, Laurence, votre réponse méritait d'être acceptée. Le module csv répondra également aux préoccupations concernant une ligne comme "","",""\n
.
surpris que personne ici n'ait mentionné pandas
. Voici une solution possible.
import pandas as pd
df = pd.read_csv('input.csv')
df.to_csv('output.csv', index=False)
dans ce script, tous les CR / CRLF sont supprimés d'un fichier CSV puis ont des lignes comme ceci:
"My name";mail@mail.com;"This is a comment.
Thanks!"
Executer le script https://github.com/eoconsulting/lr2excelcsv/blob/master/lr2excelcsv.py
Résultat (dans Excel format CSV):
"My name",mail@mail.com,"This is a comment. Thanks!"