2015-07-28 2 views
1

Я пытаюсь подсчитать количество строк в двух отдельных каталогах, которые отформатированы по-разному и сравнивают результаты. Необходимые текстовые файлы находятся в пределах одного каталога в первом каталоге, а во втором есть подкаталоги, которые мне нужны для повторения, сохранить имя, а затем вытащить и подсчитать все txt-файлы, начинающиеся с имени.Python: Итеративный подсчет строки подкаталога

На данный момент у меня возникли проблемы с сопоставлением имени подкаталога с файлами txt, которые начинаются с него. Мой отслеживающий выглядит следующим образом:

be29X1(149)% ./SeriesCount.py 
Traceback (most recent call last): 
    File "./SeriesCount.py", line 23, in <module> 
    for fn in files('subdir_name*.txt'): 
TypeError: 'list' object is not callable 

мне не нужно постоянно сохранять имя подкаталога, так как мне все равно о хранит имена файлов TXT и их подсчета в Словаре. Например, если имя каталога «regprices», я хочу вытащить количество строк для всех текстовых файлов в каталоге, которые начинаются с «regprices». Код ниже:

#!/usr/bin/env python 

import csv 
import copy 
import os 
import sys 
import glob 
import dircmp 

#set dicts 
dict1 = {} 
dict2 = {} 
final_dict = {} 

#parses through directory 1, counts lines, saves to a dict 
for fn in glob.glob('/data/*.txt'): 
    with open(fn) as f: 
     dict1[fn] = [1 for line in f if line.strip() and not line.startswith('#')] 

#parses through subdirectories in directory 2, counts lines, saves to a dict 
for subdir, dirs, files in os.walk('/docs/prod/count/'): 
    subdir_name = os.getcwd() 
    for fn in files('subdir_name*.txt'): 
     dict2[fn] = [1 for line in f if line.strip() and not line.startswith('#')] 

#compare dicts, overwrite counts from dict1 with dict2, save to final dict 

save final dictionary with key/val pairs to a csv 
with open('seriescount.csv', 'w') as f: 
    w = csv.DictWriter(f, final_dict) 
    w.writeheader() 
    w.writerow({k:sum(v) for k, v in final_dict.items()}) 

Бонусные баллы, если вы можете помочь с синтаксисом сравнением двух словарей, перезапись отсчеты от dir2 к dir1, и сохранение их в final_dict

ответ

0

Пример находится повсюду с неодинаковым по имени переменные. Определенно не рабочий пример. Трудно понять, чего вы пытаетесь достичь.

Не знаете, как вы пытаетесь сравнить словарные ключи на основе имени файла. Вот попытка угадать, чего вы пытаетесь достичь.

import glob 
import os 


def count_lines(filename): 
    with open(filename,'r') as f: 
    count = sum(1 for line in f if line.strip() and line[0] != '#') 
    return count 

def directory1_count(path='/data/*.txt'): 
    counts = {} 
    for filepath in glob.glob(path): 
    directory, filename = os.path.split(filepath) 
    name, extension = os.path.splitext(filename) 
    counts[name] = count_lines(filepath) 
    return counts 

def directory2_count(path='/docs/prod/count/'): 
    counts = {} 
    for directory, dirs, files in os.walk(path): 
    _, subdir = os.path.split(directory) 
    for filename in [x for x in files if x.startswith(subdir) and x.endswith('.txt')]: 
     name, extension = os.path.splitext(filename) 
     filepath = os.path.join(directory,filename) 
     counts[name] = count_lines(filepath) 
    return counts 

counts = directory1_count() 
counts.update(directory2_count()) 
+0

изменил дифф имени вары – briahnah

+0

Я попытался определения графа как отдельный метод, а также, но ваша строка: Count = сумма (1 для линии в е если line.strip() и линия [0]! = '#') возвращает синтаксическую ошибку (я считаю, это потому, что она не позволяет вам суммировать и подсчитывать в одной строке). Любые идеи о том, как это сделать? – briahnah

+0

Что касается сравнения двух каталогов, я просто планирую прокручивать имена файлов и, если есть дубликаты имен файлов, обновлять счетчик файлов до подсчета каталога 2 вместо каталога 1 count – briahnah