Читать все 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))