2016-04-25 1 views
-1

Мне нужно получить длину csv-файлов в ('/ dir' /), за исключением пустых строк. Я попытался это:Подсчитайте строки в нескольких файлах csv, пропустите пустые строки

import os, csv, itertools, glob 

#To filer the empty lines 
def filterfalse(predicate, iterable): 
    # filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 
    if predicate is None: 
     predicate = bool 
    for x in iterable: 
     if not predicate(x): 
      yield x 

#To read each file in '/dir/', compute the length and write the output 'count.csv' 
with open('count.csv', 'w') as out: 
    file_list = glob.glob('/dir/*') 
    for file_name in file_list: 
     with open(file_name, 'r') as f: 
       filt_f1 = filterfalse(lambda line: line.startswith('\n'), f) 
       count = sum(1 for line in f if (filt_f1)) 
       out.write('{c} {f}\n'.format(c = count, f = file_name)) 

я получаю выход я хотел бы, но, к сожалению, длина каждого файла (в «/ реж /») включает в себя пустые строки.

Чтобы увидеть, где пустые строки идут от Я прочитал file.csv, как file.txt и это выглядит следующим образом:

*text,favorited,favoriteCount,... 
"Retweeted user (@user):... 
'empty row' 
Do Operators...* 

ответ

1

Я бы рекомендовал использовать панда.

import pandas 

# Reads csv file and converts it to pandas dataframe. 
df = pandas.read_csv('myfile.csv') 

# Removes rows where data is missing. 
df.dropna(inplace=True) 

# Gets length of dataframe and displays it. 
df_length = df.count + 1 
print('The length of the CSV file is', df_length) 

Документация: http://pandas.pydata.org/pandas-docs/version/0.18.0/

1

Ваш filterfalse() функция выполняет правильно. Это точно то же, что и имя ifilterfalse в стандартной библиотеке itertools, поэтому неясно, почему вы не просто используете это, а не пишете свое собственное - главное преимущество в том, что оно уже протестировано и отлажено. (Встроенные функции часто бывают быстрее, так как многие записаны на C.)

Проблема в том, что вы не используете generator function правильно.

  1. Поскольку он возвращает generator object, нужно перебрать несколько значений будет потенциально yield с помощью кода, как for line in filt_f1.

  2. Аргумент функции предиката, который вы указываете, не обрабатывает строки, содержащие в них другие ведущие символы пробелов, такие как пробелы и вкладки. - так что lambda, который вы передаете, необходимо изменить, чтобы обрабатывать эти случаи.

В приведенном ниже коде оба этих изменения внесены в него.

import os, csv, itertools, glob 

#To filter the empty lines 
def filterfalse(predicate, iterable): 
    # filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 
    if predicate is None: 
     predicate = bool 
    for x in iterable: 
     if not predicate(x): 
      yield x 

#To read each file in '/dir/', compute the length and write the output 'count.csv' 
with open('count.csv', 'w') as out: 
    file_list = glob.glob('/dir/*') 
    for file_name in file_list: 
     with open(file_name, 'r') as f: 
      filt_f1 = filterfalse(lambda line: not line.strip(), f) # CHANGED 
      count = sum(1 for line in filt_f1) # CHANGED 
      out.write('{c} {f}\n'.format(c=count, f=file_name)) 
+0

Спасибо, он работает частично (например, я могу найти несколько пустых строк) – user2278505