Подтвердить что ты не робот

Удалить пустые строки из CSV?

У меня есть большой файл 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()

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

4b9b3361

Ответ 1

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

if any(row):

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

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

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

Ответ 2

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

EDIT: реальная пустая строка будет выглядеть как "\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.

Ответ 3

код 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

Ответ 4

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

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

Ответ 6

Мне нужно сделать это, но у меня нет пустой строки, написанной в конце файла CSV, как, к сожалению, делает этот код (что также делает Excel, если вы Save->.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 строк, последняя из которых пустая.

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

Ответ 7

Делать это с пандами очень просто. Откройте ваш 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)