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



我希望这不是小事,但我想知道以下几点:

如果我有一个包含ncsv文件的特定文件夹,我如何一次一个地迭代读取所有文件,并对它们的值执行一些计算?

例如,对于单个文件,我会这样做,并对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文件(请在此处检查):

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

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

编辑

我拥有的文件夹只有jpgcsv文件。后者被命名为eventX.csv,其中X的范围从1到50。因此,我所指的for循环应该考虑文件名的实际情况。

我就是这么做的:

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

使用panda和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)

我认为您正在寻找类似的东西

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

它首先使用外壳中的find命令在文件夹和子文件夹中搜索所有文件名,然后应用计算。

根据numpy.genfromtxt()的文档,第一个参数可以是

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

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

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,所以无法轻松测试)

在给定一些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')])

使用列表理解的另一个答案:

from os import listdir
files= [f for f in listdir("./") if f.endswith(".csv")]

下面的函数将为定义的路径中的文件夹中的每个.csv文件返回一个包含数据帧的字典。

import pandas as pd
import glob
import os
import ntpath
def panda_read_csv(path):
    pd_csv_dict = {}
    csv_files = glob.glob(os.path.join(path, "*.csv"))
    for csv_file in csv_files:
        file_name = ntpath.basename(csv_file)
        pd_csv_dict['pd_' + file_name] = pd.read_csv(csv_file, sep=";", encoding='mac_roman')
    locals().update(pd_csv_dict)
    return pd_csv_dict

您可以使用pathlib glob功能列出路径中的所有.csv,并使用pandas读取它们。然后,这只是应用你想要的任何函数的问题(如果系统化,也可以在列表理解中完成)

import pands as pd
from pathlib import Path
path2csv = Path("/your/path/")
csvlist = path2csv.glob("*.csv")
csvs = [pd.read_csv(g) for g in csvlist ]

您需要导入glob库,然后按如下方式使用它:

import  glob
path='C:\Users\Admin\PycharmProjects\db_conection_screenshot\seclectors_absent_images'
filenames = glob.glob(path + "*.png")
print(len(filenames))

相关内容

  • 没有找到相关文章

最新更新