Цикл по папкам и CSV-файлам - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь написать скрипт на Python для чтения последнего элемента (внизу справа) .csv-файлов (File001 -..- File010) внутри N папок (Folder001 -..- Folder006) и выполнения некоторых операций ( всего 10 * 6 = 60 файлов .csv). Файлы .csv имеют переменную количества строк.

Моя идея для сценария:

  • N - количество папок, а P - количество файлов .csv внутри каждой папки;
  • Войдите в папку 1, введите файлы Pcsv только для чтения их последнего элемента (внизу справа) и запишите его в список (из элементов P);
  • Суммируйте все элементы в этом списке и запишите результат в вывод списка (из N элементов)
  • Сделайте то же самое для папки 2 и т. Д.

Мне понадобится некоторая помощь, чтобы прочитать файл .csv и его последний элемент в цикле. Я прочитал много постов, но, к сожалению, не могу их применить.

N = 6
P = 10

def calculate_output(N, P):
    output = []    
    for i in range(N):        
        for j in range(P):    
            prob = []    
            if FILE NAMES ENDS WITH (".csv") in "./Folder00"+str(i+1):    
                prob.append(BOTTOM RIGHT ELEMENT OF THE FILE)    
        output.append(sum(prob[p] for p in range(P)))    
    return output 

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Спасибо большое! Я немного изменил ваше решение в этом:

N = 6
def calculate_output(N):
    output = []
    for i in range(N):
        prob = []
        dirname = "./Folder00" + str(i+1)
        for filename in os.listdir(dirname):
            if filename.endswith(".csv"):
                with open(os.path.join(dirname, filename)) as csv:
                    for line in csv:
                        pass
                    # line now contains last line
                    prob.append(int(line.rstrip('\n').split(',')[-1]))
        output.append(sum(prob))
    return output

Работает нормально.

0 голосов
/ 08 ноября 2018

Боюсь, ваш вопрос не очень понятен, но, думаю, вы хотите что-то вроде

import os

N = 6
# P = 10  # ????

def calculate_output(N, P):
    output = []
    for i in range(N):
        dirname = "./Folder00" + str(i+1)
        for filename in os.listdir(dirname):
            probsum = 0
            if filename.endswith(".csv"):
                with open(os.path.join(dirname, filename) as csv:
                    for line in csv:
                        pass
                    # line now contains last line
                    probsum += int(line.rstrip('\n').split(',')[-1])
        output.append(probsum)
    return output

Если у вас есть 10 CSV-файлов в каждой папке, тогда вам действительно не нужен параметр P; но я не совсем уверен, что правильно угадал, что ваш код должен делать здесь. Выше просто берет последнее разделенное запятыми поле из последней строки в каждом файле, и преобразует из строки в число. Функция возвращает список сумм номеров из каждой папки.

Если файлы огромные, возможно, стоит взглянуть на оптимизацию логики извлечения последней строки. Если вы знаете или можете разумно догадаться, какой длины может быть последняя строка, найдите в конце файла столько байтов; см. например Получить последние n строк файла с Python, аналогично tail

Если формат CSV имеет такие сложности, как поля в кавычках, используйте csvreader вместо попытки просто разделить запятую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...