使用Python读取目录中的所有csv文件

时间:2015-11-03 16:17:05

标签: python csv for-loop numpy genfromtxt

我希望这不是微不足道的,但我想知道以下内容:

如果我有一个带有 n csv文件的特定文件夹,我怎么能一次一个地迭代读取所有这些文件,并对它们的值进行一些计算?

对于单个文件,例如,我执行类似这样的操作并对x数组执行一些计算:

import csv
import os

directoryPath=raw_input('Directory path for native csv file: ') 
csvfile = numpy.genfromtxt(directoryPath, delimiter=",")
x=csvfile[:,2] #Creates the array that will undergo a set of calculations

我知道我可以查看给定文件夹中有多少csv个文件(请查看here):

import glob
for files in glob.glob("*.csv"):
    print files 

但是我没有弄清楚如何将numpy.genfromtxt()函数嵌套在for循环中,因此我读取了由我指定的目录的所有csv文件。

修改

我只有jpgcsv个文件夹。后者名为eventX.csv,其中 X 的范围是1到50.因此,我所指的for循环应该按照它们的方式考虑文件名。

5 个答案:

答案 0 :(得分:13)

我就是这样做的:

import os

directory = os.path.join("c:\\","path")
for root,dirs,files in os.walk(directory):
    for file in files:
       if file.endswith(".csv"):
           f=open(file, 'r')
           #  perform calculation
           f.close()

答案 1 :(得分:6)

使用pandas和glob作为基本包

import glob
import pandas as pd

glued_data = pd.DataFrame()
for file_name in glob.glob(directoryPath+'*.csv'):
    x = pd.read_csv(file_name, low_memory=False)
    glued_data = pd.concat([glued_data,x],axis=0)

答案 2 :(得分:4)

我认为你会找到类似这样的东西

import glob

for file_name in glob.glob(directoryPath+'*.csv'):
    x = np.genfromtxt(file_name,delimiter=',')[:,2]
    # do your calculations

修改

如果要从文件夹(包括子文件夹)获取所有csv文件,可以使用subprocess而不是glob(请注意,此代码仅适用于Linux系统)

import subprocess
file_list = subprocess.check_output(['find',directoryPath,'-name','*.csv']).split('\n')[:-1]

for i,file_name in enumerate(file_list):
    x = np.genfromtxt(file_name,delimiter=',')[:,2]
    # do your calculations
    # now you can use i as an index

它首先使用shell中的find命令在文件夹和子文件夹中搜索所有file_names,然后再应用您的计算。

答案 3 :(得分:2)

根据numpy.genfromtxt()的{​​{3}},第一个参数可以是

  

要读取的文件,文件名或生成器。

这意味着您可以编写一个生成所有文件行的生成器,如下所示:

def csv_merge_generator(pattern):
    for file in glob.glob(pattern):
        for line in file:
            yield line

# then using it like this

numpy.genfromtxt(csv_merge_generator('*.csv')) 

应该有效。 (我没有安装numpy,因此无法轻松测试)

答案 4 :(得分:1)

考虑到一些 path = "/path/to/dir/",这是一种更简洁的方法。

import glob
import pandas as pd

pd.concat([pd.read_csv(f) for f in glob.glob(path+'*.csv')])

然后你可以将你的计算应用到整个数据集,或者,如果你想一个一个地应用它:

pd.concat([process(pd.read_csv(f)) for f in glob.glob(path+'*.csv')])