如何计算多个csv文件中的行数

时间:2017-04-10 10:32:40

标签: python pandas dataframe

我有csv文件,如下所示

文件1

A B
1 2
3 4

file2的

A B
1 2

file3的

A B
1 2
3 4
5 6

我想计算所有csv文件中的行

我试过

f=pd.read_csv(file1)

f.shape

但是当我有很多csv文件时,需要花费太多时间。

我想得到如下结果

      rows
file1  2
file2  1
file3  3

我怎样才能得到这个结果?

5 个答案:

答案 0 :(得分:5)

您可以创建dictlength个所有文件,然后Series m创建DataFrame添加to_frame

import glob
import pandas as pd

files = glob.glob('files/*.csv')

d = {f: sum(1 for line in open(f)) for f in files}

print (pd.Series(d))

print (pd.Series(d).rename('rows').rename_axis('filename').reset_index())

open不保证文件正确关闭,因此另一个解决方案是:

def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

d = {f: file_len(f) for f in files}

答案 1 :(得分:2)

为了完整性作为一种关于速度和文件正确打开/关闭的所有内容的总结,这里有一个解决方案,可以快速工作,不需要太多花哨的代码,...仅限于* nix系统(?)(但我认为类似的技术也可用于其他系统)。

下面的代码运行速度比rawincount()快一点,并计算最后一行在行尾没有'\ n'的行(问题rawincount()有):

import glob, subprocess, pandas
files = glob.glob('files/*.csv') 
d = {f: subprocess.getoutput("sed -n '$=' " + f) for f in files}
print(pandas.Series(d))

P.S。这里有一些时间我在一组大文本文件上运行(39个文件,总大小为3.7 GByte,Linux Mint 18.1,Python 3.6)。令人着迷的是提议的wc -l *.csv方法的时间安排:

    Results of TIMING functions for getting number of lines in a file:
    -----------------------------------------------------------------
            getNoOfLinesInFileUsing_bash_wc :  1.04  !!! doesn't count last non empty line
          getNoOfLinesInFileUsing_bash_grep :  1.59
  getNoOfLinesInFileUsing_mmapWhileReadline :  2.75
           getNoOfLinesInFileUsing_bash_sed :  3.42
 getNoOfLinesInFileUsing_bytearrayCountLF_B :  3.90  !!! doesn't count last non empty line
          getNoOfLinesInFileUsing_enumerate :  4.37
      getNoOfLinesInFileUsing_forLineInFile :  4.49
  getNoOfLinesInFileUsing_sum1ForLineInFile :  4.82      
 getNoOfLinesInFileUsing_bytearrayCountLF_A :  5.30  !!! doesn't count last non empty line
     getNoOfLinesInFileUsing_lenListFileObj :  6.02
           getNoOfLinesInFileUsing_bash_awk :  8.61

答案 2 :(得分:1)

试试这个,

它为每个条目添加文件名和行数,并且列具有适当的标签:

import os      
df = pd.DataFrame(columns=('file_name', 'rows'))
for index,i in enumerate(os.listdir('.')):
    df.loc[index] = [i,len(pd.read_csv(i).index)]

答案 3 :(得分:1)

到目前为止提供的解决方案在使用非常大的csv时并不是最快的。此外,在列表推导中使用open()并不能保证文件正确关闭,例如,使用with时(请参阅this question)。 因此,将其与this question的见解相结合以提高速度:

from itertools import takewhile, repeat

def rawincount(filename):
    with open(filename, 'rb') as f:
        bufgen = takewhile(lambda x: x, (f.raw.read(1024*1024) for _ in repeat(None)))
        return sum(buf.count(b'\n') for buf in bufgen)

并应用@jezrael提供的解决方案:

import glob
import pandas as pd

files = glob.glob('files/*.csv')
d = {f: rawincount(f) for f in files}
df = pd.Series(d).to_frame('rows')

答案 4 :(得分:1)

在* nix系统中,如果你可以在Python之外完成它:

wc -l *.csv

应该做的伎俩。