Удалить пустые строки из 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()
Это нормально или есть лучший способ сделать это?
Ответы
Ответ 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)
Ответ 5
В этом script все CR/CRLF удаляются из файла CSV, а затем имеют такие строки:
"My name";[email protected];"This is a comment.
Thanks!"
Выполните script https://github.com/eoconsulting/lr2excelcsv/blob/master/lr2excelcsv.py
Результат (в формате Excel CSV):
"My name",[email protected],"This is a comment. Thanks!"
Ответ 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)