Читать все CSV-файлы из каталога, используя Python

Я надеюсь, что это не тривиально, но мне интересно следующее:

Если у меня есть конкретная папка с 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 файлы находятся в данной папке (проверьте здесь):

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

Но я не смог понять, как, возможно, вкладывать numpy.genfromtxt() Функция в цикле for, так что я читаю во всех файлах csv директории, которые я могу указать.

РЕДАКТИРОВАТЬ

У меня есть только папка jpg а также csv файлы. Последние названы eventX.csv где Х составляет от 1 до 50. for Поэтому цикл, на который я ссылаюсь, должен учитывать имена файлов такими, какие они есть.

9 ответов

Решение

Вот как я это сделаю:

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

Использование 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)

Я думаю, что вы ищете что-то вроде этого

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 Команда из оболочки и применяет ваши расчеты впоследствии.

Вот более лаконичный способ сделать это, учитывая некоторые 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')])

Согласно документации 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, поэтому не могу легко проверить)

Другой ответ, использующий понимание списка:

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

Вы можете использовать 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 ]

Приведенная ниже функция вернет словарь, содержащий кадр данных для каждого файла .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

Вам нужно импортировать библиотеку glob, а затем использовать ее следующим образом:

      import  glob
path='C:\\Users\\Admin\\PycharmProjects\\db_conection_screenshot\\seclectors_absent_images'
filenames = glob.glob(path + "\*.png")
print(len(filenames))
Другие вопросы по тегам