2015-11-03 3 views
5

Я надеюсь, что это не тривиально, но мне интересно, следующее:Читайте во всех 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 файлов находятся в данной папке (проверить here):

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

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

EDIT

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

ответ

7

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

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

Может ли строка 'f.close()' быть размещена сразу после определения «x = csvfile [:, 2]'? Номер '2' является просто иллюстративным. – FaCoffee

+0

И, если я могу добавить, ваш код проверяет все файлы 'csv' во ВСЕХ папках в' directory'? – FaCoffee

+1

в качестве примечания, рекомендуемым способом открытия файлов является 'с открытым (файлом) как файл', это имеет преимущество автоматического закрытия, когда из области – Busturdust

3

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

import glob 

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

Edit

Если вы хотите, чтобы получить все csv файлы из (включая подпапку) вы можете использовать subprocess вместо glob (обратите внимание, что этот код работает только на системах Линукс)

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 

Это первый поиск папки и вложенные папки для всех file_names с помощью команды find из оболочки и применяет свои вычисления впоследствии.

+0

Ну, мне очень нравится это удобное и короткое решение, но я его протестировал, и он не дал того, что я хотел. Я создал новую пустую папку, разместил в ней три 'csv'-файла с именами' file_1.csv', 'file_2.csv' и' file_3.csv', каждый из которых имеет значение '1',' 2' и '3' как уникальное значение (без заголовка). Затем я создал 'a = numpy.zeros (3)', чтобы заполнить его этими значениями, но я получаю 'a = ([0,0,0])'. В цикле 'for' новые значения' a' присваиваются следующим образом: 'a [имя_файла] = numpy.genfromtxt (имя_файла, разделитель = ',') [0,0]'. Вместо 'a = ([1,2,3])' Я получаю 'a = ([0,0,0])'. – FaCoffee

+1

Хм ... это сработало для моих простых примеров ... позвольте мне проверить, что может пойти не так ... – plonser

+0

@FrancescoCastellani: 'имя_файла' - это строка в моем коде ... что вы имеете в виду с' a [имя_файла] '? 'a [...]' требует целого числа ... нет ли ошибок? – plonser

2

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

+0

Будет ли ваша последняя строка вложенной в цикл 'for'? – FaCoffee

+1

nonono, он передается в генераторе и как таковой получает все файлы – Ward