2014-02-07 4 views
0

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

Я пытаюсь

  1. назначить директорию
  2. перебирать файлы, используя Glob
  3. назначить обработчик файлов для каждого найденного файла в каталоге
  4. использовать аннотацию метод, который затем вызывает ряд других методов, которые называют друг друга.
  5. Сортировка и разбор файла
  6. Печать результатов сортировки и разбора.

Код:

#! /usr/bin/env python3 
#This utility attempts to parse the output text files generated by dcp_inspect 
#for faster inspection and when attending to multiple DCP inspections. 
#dcp_inspect_parse runs on Python3.x 
import logging 
import os 
import re 
import sys 

from glob import glob 

logging.basicConfig(level=logging.DEBUG) 

class DcpParser: 
    """Parses DCP Inspector output files, and writes summary files to a 
    directory whose path is supplied at construction.""" 



    def parse(self, dir): 
     """Parses all files in the current directory.""" 
     cpl     = [] 
     content    = [] 
     contentkind   = [] 
     container   = [] 
     errors    = [] 
     package    = [] 
     summary    = [] 
     mainsound   = [] 
     mainpicture   = [] 
     encryption   = [] 
     duration    = [] 
     fsp     = [] 
     dimensiontype  = [] 
     aspect    = [] 
     filesize    = [2] 
     audio    = [] 
     cpltype    = [] 
     os.chdir(dir) 
     files = glob('*') 
     logging.debug("Found files: %s", files) 
     for file in files: 
      try: 
       with open(file) as data: 
        logging.debug("Opening file: %s", data) 
        print("Scanning...\t\t\t", file) 
        for each_line in data: 
         #self.prints() 
         self.file_summary() 
         #self.audio() 

      except: 
       pass 



    def prints(self): 

      print('Container:    \t\t',container.strip())   
      print('CPL Type:    \t\t',cpltype) 
      print('Duration:    \t\t',duration.strip(',')) 
      print('Frame Rate:   \t\t',fps) 
      print('Aspect Ratio:   \t\t',aspect.strip(',')) 
      print('Dimension:    \t\t',dimensiontype.strip(',')) 
      print('Content Title:   \t\t',content.strip(',').strip('""')) 
      print('Audio for DCP:   \t\t', audio) 
      print('Package size:   \t\t',filesize) 
      print('Encryption status:  \t\t',encryption.upper().strip())  
      print('CPL ID:    \t\t', cpl[2]) 
      print('Content Kind:   \t\t',contentkind.upper()) 
      print('\n') 
      print('There are',errors[1],'Errors and',errors[3],'hints for', content.strip(',')) 
      if errors[1] != '0': 
       print('could be issues\n') 
      else: 
       print('This DCP appears to be OK\n')  


    def file_summary(self): 
     print('made it to summary') 
     self.file_audio() 
     for each_line in data: 
      if 'summary'in each_line: 
       summary.extend(each_line.split()) 
       print(summary.extend(each_line.split())) 
       for x in range(len(summary)): 
        if 'fps' in summary[x]: 
         fps = summary[(x-1)] 
         duration = summary[(x-2)].strip() 

        elif 'summary:' in summary[x]: 
         content = summary[(x+1)] 
         content.strip(',') 

        elif '2D' in summary[x]: 
         dimensiontype = summary[(x)] 
         aspect = summary[(x+1)].strip(',') 

        elif '3D' in summary[x]: 
         dimensiontype = summary[(x)] 
         aspect = summary[(x+1)] 

      elif 'Errors' in each_line: 
       errors=(each_line.split()) 
      elif 'Package with total size'in each_line: 
       if 'Bytes 0' in each_line: 
        pass 
       else: 
        temp =[] 
        temp.extend(each_line.split()) 
        filesize=(temp.pop()+' '+temp.pop()) 


    def file_audio(self): 
     print('made it to audio') 
     self.file_picture() 
     for each_line in data: 

      if 'MainSound'in each_line: 

       if 'audio' in each_line: 
        m = re.search('([0-9]+)bps', each_line) 
        if m is None: 
         bps = 'bps error' 
        else: 
         bps = int(m.group(1)) 

        m = re.search('([0-9]+)ch', each_line) 
        if m is None: 
         channels = 'channel error' 
        else: 
         channels = int(m.group(1)) 

        m = re.search('([0-9]+)kHz', each_line) 
        if m is None: 
         bandwidth = 'bandwidth error' 
        else: 
         bandwidth = int(m.group(1)) 

        audio = '%ich %ikHz %ibps' % (channels, bandwidth, bps) 


    def file_picture(self): 
     print('made it to picture') 
     for each_line in data: 

      if 'MainPicture'in each_line: 
       if 'pictures' in each_line: 
        temp = [] 
        temp.extend(each_line.split(',')) 
        container = temp[-2] 
        encryption= temp[-3] 




    def file_cplId(self): 
     print('cpl id') 
     if 'CPL Id:'in each_line: 
      cpl=(each_line.split()) 


    def file_cplType(self): 
     if 'CPL type: 'in each_line: 
      cpltype=(each_line.split()) 
      cpltype = cpltype[2] 

    def file_contentKind(self): 
     if 'ContentKind: 'in each_line: 
      contentkind=(each_line.split()) 
      contentkind = contentkind[1] 

    def file_contentTitleText(self): 
     if 'ContentTitleText:'in each_line: 
      content=(each_line.split(':')) 
      content = content[1] 










if __name__ == '__main__': 
    print("Input directory name: " + os.getcwd()) 
    default_dir = os.getenv('HOME') + '/Desktop/dcp_output' 
    prompt = "Please enter the output directory name [" + default_dir + "]: " 
    dir = input(prompt) or default_dir 
    print("Output directory name: " + dir) 

    parser = DcpParser() 

    parser.parse(dir) 
+2

Любой шанс, что вы могли бы сузить его немного? Попробуйте прочитать http://sscce.org – jonrsharpe

+2

«Почему эти методы не работают так, как я ожидаю?» Не могли бы вы объяснить, что вы ожидаете, и что на самом деле происходит? – SethMMorton

ответ

2

Это мне кажется странным, что ни один из ваших переменных не начинаются с self., что означает, что у вас нет каких-либо членов класса, все переменные являются локальными в соответствующем методе.

Также вы использовали try except pass вокруг основной части вашего кода, которая будет игнорировать любую ошибку. Одна из этих ошибок заключалась бы в том, что вы получаете доступ к data в нескольких методах, которые не являются глобальной переменной и не назначены ранее в методе.

Удалите try except pass для целей отладки и сообщите, что произойдет.

+0

Вы правы. Данные дают мне печаль. Так мне просто нужно декларировать данные? – inbinder

+0

@ user1124541 Я предполагаю, что это должен быть член класса, в этом случае вам нужно использовать 'self.data' вместо' data'. – Nabla

+0

Как сделать членов класса доступными для всех функций/методов? – inbinder

Смежные вопросы