2010-12-23 6 views
12

У меня есть большой файл csv, в котором некоторые строки полностью пусты. Как использовать Python для удаления всех пустых строк из csv?Удалить пустые строки из 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() 

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

+0

Почему тот факт, что файл это CSV файл значение? –

+0

Только для того, чтобы убедиться, что использование модуля csv имеет значительные преимущества перед его использованием. – debugged

+0

Использование модуля csv имеет одно главное преимущество, изложенное Лоуренсом Гонсалвесом: его, когда входной файл имеет пустые строки, встроенные в поля csv. –

ответ

17

Используйте csv модуль:

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

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

if any(row): 

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

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

huh, тот же код работает без модуля csv, если вы используете 'if row.strip()' – nosklo

+0

Спасибо LG, что работа для меня. Хотя у меня также есть несколько строк с пустыми полями. Пример: ',,,,, \ n'. Как проверить пустые строки и строки с пустыми полями с помощью модуля csv. – debugged

+0

@debugged: 'empty = all (len (c) == 0 для c в строке)' –

1

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

EDIT: настоящая пустая строка будет как «\ п»:

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

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

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.

+0

Ok. Как проверить, нет ли строки? Я ищу код – debugged

+0

Спасибо Пауло. У меня две ситуации происходят в моем CSV. Пустые строки и все пустые поля в строке, как вы упомянули выше. Теперь, каково преимущество/недостаток использования вашего метода над модулем csv? – debugged

+0

@debugged: метод csv, описанный в вышеперечисленном ответе, не удалит строку со всеми пустыми полями. Если вы только отфильтровываете пробелы, модуль csv кажется излишним. Если вы сделаете дальнейшую манипуляцию, перейдите с модулем csv, так как он разделит каждую строку csv на удобный список python. –

2

Код python для удаления пустой строки из файла csv без создания другого файла.

Защиту 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 
Смежные вопросы