Удалить пустые строки из CSV? - PullRequest
16 голосов
/ 23 декабря 2010

У меня есть большой CSV-файл, в котором некоторые строки полностью пустые. Как мне использовать Python, чтобы удалить все пустые строки из CSV?

После всех ваших предложений, это то, что я имею до сих пор

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

Это нормально или есть лучший способ сделать это?

Ответы [ 7 ]

22 голосов
/ 23 декабря 2010

Используйте модуль 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)

Если вам также необходимо удалить строки, в которых все поля пусты, измените строку if row: на:

if any(row):

И если вы также хотите обрабатывать поля, состоящие только из пробелов, как пустые, вы можете заменить их на:

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

Обратите внимание, что в Python 2.x и более ранних версиях csv модуль ожидает двоичные файлы, поэтому вам нужно открыть файлы с флагом e 'b'.В 3.x это приведет к ошибке.

3 голосов
/ 23 декабря 2010

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

РЕДАКТИРОВАТЬ: настоящая пустая строка будет похожа на '\n ':

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

строка со всеми пустыми полями будет выглядеть как' ,,,,, \ n '.Если вы считаете это пустой строкой:

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

открытие, закрытие, удаление и переименование файлов оставлено для вас в качестве упражнения.(подсказка: import os, help (open), help (os.rename), help (os.unlink))

EDIT2: Лоуренс Гонсалвес обратил мое внимание на то, что в допустимом файле csv могут быть вставлены пустые строкиполя csv в кавычках, например 1, 'this\n\nis tricky',123.45.В этом случае модуль CSV позаботится об этом за вас.Прости, Лоренс, твой ответ заслуживает принятия.Модуль csv также решает проблемы, связанные с такой строкой, как "","",""\n.

2 голосов
/ 29 марта 2018

Удивлен, что здесь никто не упомянул pandas.Вот возможное решение.

import pandas as pd
df = pd.read_csv('input.csv')
df.to_csv('output.csv', index=False)
2 голосов
/ 10 мая 2017

Python-код для удаления пустой строки из файла CSV без создания другого файла.

def ReadWriteconfig_file (файл):

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
0 голосов
/ 05 февраля 2019

Делать это с пандами очень просто. Откройте ваш CSV-файл с пандами:

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)
0 голосов
/ 03 января 2019

Мне нужно сделать это, но у меня нет пустой строки, написанной в конце CSV-файла, как, к сожалению, делает этот код (что также делает Excel, если вы сохраняете-> .csv). Мой (даже более простой) код, использующий модуль CSV, тоже делает это:

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 имеет ровно 125 строк; программа всегда выводит 126 строк, последняя из которых пустая.

Я прошел через все эти темы, и кажется, что ничто не может изменить это поведение.

0 голосов
/ 10 сентября 2012

В этом сценарии все CR / CRLF удаляются из CSV-файла, затем в нем есть такие строки:

"My name";mail@mail.com;"This is a comment.
Thanks!"

Выполнить сценарий https://github.com/eoconsulting/lr2excelcsv/blob/master/lr2excelcsv.py

Результат (в формате Excel CSV):

"My name",mail@mail.com,"This is a comment. Thanks!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...