Поиск по блогу

четверг, 19 февраля 2015 г.

Методика перенастройки и отладки pdf парсера AEBto3tables с использован ем IPyNotebook

Формат таблиц в pdf файлах за год несколько раз менялся. После того, как я понял, что надо каждый раз перестраивать парсеры строк, то понял, что даже, если у меня будет десяток разных парсеров для этого сайта, то я определенно в них запутаюсь. Надо записывать все в одном месте - и результаты, и код, и процесс отладки. Здесь я записал процесс перенастройки по файлу августа 2014 и научился наследовать собственный класс.

In [1]:
!chcp 65001
!dir C:\Users\kiss\Documents\Xpdf\aebru_2014_all_txt
Active code page: 65001
 Volume in drive C has no label.
 Volume Serial Number is 6017-2A0B

 Directory of C:\Users\kiss\Documents\Xpdf\aebru_2014_all_txt

16.02.2015  18:58    <DIR>          .
16.02.2015  18:58    <DIR>          ..
19.02.2015  16:07            39В 554 eng_car-sales-in-april-2014.txt
19.02.2015  16:07            44В 594 eng_car-sales-in-august-2014.txt
19.02.2015  16:07            46В 607 eng_car-sales-in-december-2014.txt
19.02.2015  16:07            46В 456 eng_car-sales-in-july-2014.txt
16.02.2015  18:57            44В 371 eng_car-sales-in-june-2014.txt
16.02.2015  18:58            43В 519 eng_car-sales-in-may-2014.txt
16.02.2015  18:58            46В 828 eng_car-sales-in-november-2014.txt
16.02.2015  18:58            48В 159 eng_car-sales-in-october-2014.txt
16.02.2015  18:58            45В 552 eng_car-sales-in-september-2014.txt
16.02.2015  18:58            39В 596 sales-in-december_2013_eng_final.txt
16.02.2015  18:58            39В 646 sales-in-february_2014_eng_final.txt
16.02.2015  18:58            36В 666 sales-in-january_2014_eng_final_1.txt
16.02.2015  18:58            40В 369 sales-in-march_2014_eng_final.txt
              13 File(s)        561В 917 bytes
               2 Dir(s)  388В 963В 794В 944 bytes free

Пропишем путь к рабочему модулю в переменную окружения

In [1]:
import sys
sys.path.append('C:\\Users\\kiss\\SkyDrive\\Docs\\pdftotext\\AEB\\pdgtotext')
In [4]:
sys.path
Out[4]:
['',
 'C:\\Users\\kiss\\Documents\\Python-Django',
 'C:\\Users\\kiss\\Anaconda\\Lib\\site-packages\\django\\bin',
 'C:\\Users\\kiss\\Anaconda\\python27.zip',
 'C:\\Users\\kiss\\Anaconda\\DLLs',
 'C:\\Users\\kiss\\Anaconda\\lib',
 'C:\\Users\\kiss\\Anaconda\\lib\\plat-win',
 'C:\\Users\\kiss\\Anaconda\\lib\\lib-tk',
 'C:\\Users\\kiss\\Anaconda',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\PIL',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\Sphinx-1.2.3-py2.7.egg',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\win32',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\win32\\lib',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\Pythonwin',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\queuelib-1.2.2-py2.7.egg',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\runipy-0.1.1-py2.7.egg',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\setuptools-11.3.1-py2.7.egg',
 'C:\\Users\\kiss\\Anaconda\\lib\\site-packages\\IPython\\extensions',
 'C:\\Users\\kiss\\SkyDrive\\Docs\\pdftotext\\AEB\\pdgtotext']

Вот он, последний, теперь импортируем все сюда

In [4]:
from aebto3tables import *
In []:
Проверим, вот константа из модуля:
In [5]:
CSVFOLDER
Out[5]:
'C:\\Users\\kiss\\Documents\\Xpdf\\aerbu_2014_all_csv'
In [53]:
class August(Aebto3tables):
    """Try to tune august"""
    #txtfile_path = 'C:\\Users\\kiss\\Documents\\Xpdf\\aebru_2014_all_txt\\eng_car-sales-in-august-2014.txt'
    #csvfilename = 'eng_car-sales-in-august-2014.csv'
    #
    def alltxt2csv(self, path=TXTDATAFOLDER):
        """
        The loop into folder with preliminary converted txt files
        to call 1-3 tables parsers
        Warning: it does not work if filename include additional
        dots ('.') except file extension '.txt'
        """
        
        for dir_entry in os.listdir(path):
            if dir_entry.split('.')[1] == 'txt':
                txtfile_path = os.path.join(path, dir_entry)

                filename = dir_entry.split('.')[0]
                #txtfilename = filename + r'.csv'
                #csvfile_path = os.path.join(targetpath, txtfilename)
                csvfilename = filename + r'.csv'
                
                if os.path.isfile(txtfile_path):

                    self.tab1fromtxt(txtfile_path, csvfilename)
                    self.tab2fromtxt(txtfile_path, csvfilename)
                    self.tab3fromtxt(txtfile_path, csvfilename)
    
    
    def tab1fromtxt(self, txtfile_path, csvfilename, csvfolder=CSVFOLDER):
            """
            Первая таблица - самые продаваемые марки (50 строк)
            Вот первые две:
            Lada 151527 159490 -5% 44100 50102 -12%
            Renault* 67208 57217 17% 19178 17914 7%
            """
            t1 = []
            with open(txtfile_path) as f1:
                for line in f1:
                    if len(line.split()) in range(6, 9):
                        if (line.split()[-1].find('-') != -1) | (line.split()[-1].find('%') != -1):
                            if (line.split()[-4].find('-') != -1) | (line.split()[-4].find('%') != -1):
                                if (line.partition('  ')[2] != ['']) and (line.partition('  ')[0].strip() != 'Total'):
                                    tline = []
                                    tline.append(line.partition('  ')[0])
                                    tline = tline + line.partition('  ')[2].split()
                                    t1.append(tline)
            csvfile_path = csvfolder + '\\1aug\\' + csvfilename
            self.tocsv(t1, csvfile_path)
            #print t1
            
    def tab2fromtxt(self, txtfile_path, csvfilename, csvfolder=CSVFOLDER):
        """
        Вторая - суммарные продажи по фирмам (все фирмы)
        NISSAN 30,9 31,1 266169 274285 -3% 29,3 30,2 71977 80630 -12%
        AVTOVAZ 17,6 18,1 151527 159490 -5% 18,0 18,8 44100 50102 -12%
        """
        t2 = []
        with open(txtfile_path) as f2:
            for line in f2:
                if len(line.split()) in range(12, 15):
                    if (line.split()[-1].find('-') != -1) | (line.split()[-1].find('%') != -1):
                        if (line.split()[-7].find('-') != -1) | (line.split()[-7].find('%') != -1):
                            if (line.partition('  ')[2] != ['']) and (len(line.partition('  ')[2].split()) == 12):
                                tline = []
                                tline.append(line.partition('  ')[0])
                                tline = tline + line.partition('  ')[2].split()
                                t2.append(tline)
        csvfile_path = csvfolder + '\\2aug\\' + csvfilename
        self.tocsv(t2, csvfile_path)
        #print t2

    def tab3fromtxt(self, txtfile_path, csvfilename, csvfolder=CSVFOLDER):
        """
        Третья должна состоять  из 25 строк вида:
        1 Granta Lada 52765 26674 98% 15596 9798 59%
        2 Solaris Hyundai 35941 38051 -6% 10553 10979 -4%
        """
        t3 = []
        with open(txtfile_path) as f3:
            for line in f3:
                if len(line.split()) in range(12, 16):
                    if line.split()[0].isdigit():
                        if (line.find('  ') != -1):
                            if (line.partition('  ')[2] != ['']) and (line.partition('  ')[0].isdigit()):
                                tline = []
                                tline.append(line.partition('  ')[0])
                                tline = tline + line.partition('  ')[2].split()
                                t3.append(tline)
        csvfile_path = csvfolder + '\\3aug\\' + csvfilename
        self.tocsv(t3, csvfile_path)
        #print t3
In [16]:
txtfile_path = 'C:\\Users\\kiss\\Documents\\Xpdf\\aebru_2014_all_txt\\eng_car-sales-in-august-2014.txt'
csvfilename = 'eng_car-sales-in-august-2014.csv'    
In [54]:
A =  August('2014-08')

Сам по себе алгоритм отладки не очень удобный, но этот файл .ipynb потом можно использовать, как парасер.

  1. Правишь код в классе In[53]
    2. Инициируешь классе In[53]
    3. Создаешь экземпляр In[54]
    5. Запускаешь метод In[22]
    4. Но сначала присваиваешь значения параметрам метода In[16]

Внимание! папки для записи файлов задаются в трех подпрограммах в строках:

In []:
csvfile_path = csvfolder + '\\1aug\\' + csvfilename
csvfile_path = csvfolder + '\\2aug\\' + csvfilename
csvfile_path = csvfolder + '\\3aug\\' + csvfilename

Однако, записывать результаты еще рано, сначала в каждой подпрограмме отключим запись в файл и зададим вывод на печать:

In []:
# Должно быть  при отладке
#csvfile_path = csvfolder + '\\3\\' + csvfilename
#self.tocsv(t3, csvfile_path)
print t3

Ниже результаты для каждой подпрограммы.

In [22]:
 A.tab1fromtxt(txtfile_path, csvfilename)   
[['Lada', '26,467', '39,079', '-32%', '247,289', '303,357', '-18%'], ['KIA', '13,644', '17,013', '-20%', '122,920', '128,982', '-5%'], ['Hyundai*', '13,416', '14,219', '-6%', '117,451', '118,438', '-1%'], ['Toyota*', '12,722', '13,778', '-8%', '102,522', '101,431', '1%'], ['Renault*', '12,388', '15,181', '-18%', '124,028', '137,827', '-10%'], ['Nissan*', '11,061', '11,611', '-5%', '102,545', '86,963', '18%'], ['VW', '8,604', '13,024', '-34%', '84,967', '103,607', '-18%'], ['Chevrolet', '7,952', '15,984', '-50%', '81,701', '111,671', '-27%'], ['\xc5\xa0koda', '6,774', '7,103', '-5%', '55,885', '56,755', '-2%'], ['GAZ LCV*', '5,177', '7,538', '-31%', '42,475', '52,963', '-20%'], ['Opel', '4,328', '6,933', '-38%', '42,768', '53,077', '-19%'], ['Mitsubishi', '4,200', '6,127', '-31%', '46,157', '49,789', '-7%'], ['Mercedes-Benz', '4,012', '3,914', '3%', '32,097', '27,779', '16%'], ['UAZ*', '3,894', '3,857', '1%', '26,454', '32,998', '-20%'], ['Ford*', '3,852', '8,938', '-57%', '39,670', '69,354', '-43%'], ['Mazda', '3,705', '3,700', '0%', '31,249', '27,142', '15%'], ['Audi', '2,601', '2,767', '-6%', '23,167', '23,902', '-3%'], ['Daewoo', '2,443', '5,403', '-55%', '29,303', '36,585', '-20%'], ['BMW', '2,182', '2,469', '-12%', '23,917', '25,258', '-5%'], ['Lifan', '1,901', '2,646', '-28%', '13,912', '16,729', '-17%'], ['SsangYong', '1,643', '2,934', '-44%', '15,487', '22,450', '-31%'], ['Lexus', '1,617', '1,430', '13%', '11,921', '10,204', '17%'], ['Land Rover', '1,567', '1,702', '-8%', '13,653', '13,009', '5%'], ['Honda', '1,363', '2,303', '-41%', '13,787', '16,823', '-18%'], ['Great Wall', '1,292', '1,230', '5%', '10,695', '13,352', '-20%'], ['Suzuki', '1,246', '2,957', '-58%', '12,294', '19,329', '-36%'], ['Peugeot*', '1,238', '2,788', '-56%', '14,744', '23,252', '-37%'], ['Volvo', '1,234', '1,230', '0%', '10,327', '9,637', '7%'], ['Citro\xd1\x91n*', '1,232', '2,559', '-52%', '13,693', '19,331', '-29%'], ['Geely', '1,226', '2,776', '-56%', '11,897', '17,250', '-31%'], ['Subaru', '1,116', '1,189', '-6%', '10,462', '11,118', '-6%'], ['Chery', '1,077', '1,601', '-33%', '11,446', '13,126', '-13%'], ['VW NFZ*', '929', '1,282', '-28%', '8,451', '10,292', '-18%'], ['\x0cMercedes-Benz', 'Vans*', '738', '526', '40%', '4,589', '2,942', '56%'], ['Jeep', '630', '427', '48%', '5,090', '2,840', '79%'], ['Infiniti', '539', '624', '-14%', '5,282', '5,675', '-7%'], ['FIAT*', '519', '731', '-29%', '4,760', '4,912', '-3%'], ['Porsche', '290', '269', '8%', '2,847', '2,432', '17%'], ['FAW', '230', '567', '-59%', '2,164', '2,896', '-25%'], ['Jaguar', '127', '152', '-16%', '1,108', '1,090', '2%'], ['Changan', '102', '-', '-', '665', '-', '-'], ['SEAT', '101', '371', '-73%', '1,145', '2,663', '-57%'], ['MINI', '100', '229', '-56%', '1,064', '1,813', '-41%'], ['Acura**', '78', '-', '-', '487', '-', '-'], ['Haima', '76', '51', '49%', '493', '187', '164%'], ['BAW*', '68', '131', '-48%', '788', '1,148', '-31%'], ['Cadillac', '60', '114', '-47%', '848', '1,023', '-17%'], ['Isuzu*', '55', '25', '120%', '308', '98', '214%'], ['Foton*', '48', '0', '-', '59', '6', '883%'], ['Brilliance****', '46', '-', '-', '278', '-', '-'], ['JAC*****', '45', '-', '-', '234', '-', '-'], ['smart', '32', '10', '220%', '218', '118', '85%'], ['Alfa Romeo', '17', '-', '-', '54', '-', '-'], ['TagAZ*', '5', '29', '-83%', '110', '311', '-65%'], ['ZAZ', '3', '153', '-98%', '481', '2,264', '-79%'], ['Luxgen', '2', '-', '-', '79', '-', '-'], ['Chrysler', '1', '19', '-95%', '86', '133', '-35%'], ['Vortex', '0', '34', '-', '0', '923', '-'], ['BYD', '0', '2', '-', '5', '102', '-95%'], ['Dodge', '0', '14', '-', '26', '161', '-84%'], ['Bogdan', '0', '147', '-', '92', '1,678', '-95%'], ['Izh', '0', '25', '-', '19', '610', '-97%'], ['cars', '8,604', '13,024', '-33.9%', '84,967', '103,607', '-18.0%'], ['vans', '929', '1,282', '-27.5%', '8,451', '10,292', '-17.9%'], ['BENZ cars', '4,012', '3,914', '2.5%', '32,097', '27,779', '15.5%'], ['BENZ vans', '738', '526', '40.3%', '4,589', '2,942', '56.0%']]

In [34]:
A.tab2fromtxt(txtfile_path, csvfilename) 
[['RENAULT-', '29.3', '28.7', '0.6', '50,455', '66,495', '-24.1%', '30.3', '29.7', '0.6', '479,144', '533,822', '-10.2%'], ['AVTOVAZ', '15.4', '16.9', '(1.5)', '26,467', '39,079', '-32.3%', '15.6', '16.9', '(1.3)', '247,289', '303,357', '-18.5%'], ['RENAULT', '7.2', '6.5', '0.7', '12,388', '15,181', '-18.4%', '7.8', '7.7', '0.1', '124,028', '137,827', '-10.0%'], ['NISSAN', '6.4', '5.0', '1.4', '11,061', '11,611', '-4.7%', '6.5', '4.8', '1.7', '102,545', '86,963', '17.9%'], ['INFINITI', '0.3', '0.3', '0.0', '539', '624', '-13.6%', '0.3', '0.3', '0.0', '5,282', '5,675', '-6.9%'], ['VW Group', '11.1', '10.6', '0.5', '19,009', '24,547', '-22.6%', '11.0', '11.0', '0.0', '173,615', '197,219', '-12.0%'], ['AUDI', '1.5', '1.2', '0.3', '2,601', '2,767', '-6.0%', '1.5', '1.3', '0.2', '23,167', '23,902', '-3.1%'], ['SEAT', '0.1', '0.2', '(0.1)', '101', '371', '-72.8%', '0.1', '0.1', '0.0', '1,145', '2,663', '-57.0%'], ['\xc5\xa0KODA', '3.9', '3.1', '0.8', '6,774', '7,103', '-4.6%', '3.5', '3.2', '0.3', '55,885', '56,755', '-1.5%'], ['TOYOTA Group', '8.3', '6.6', '1.7', '14,339', '15,208', '-5.7%', '7.2', '6.2', '1.0', '114,443', '111,635', '2.5%'], ['TOYOTA', '7.4', '5.9', '1.5', '12,722', '13,778', '-7.7%', '6.5', '5.6', '0.9', '102,522', '101,431', '1.1%'], ['LEXUS', '0.9', '0.6', '0.3', '1,617', '1,430', '13.1%', '0.8', '0.6', '0.2', '11,921', '10,204', '16.8%'], ['KIA', '7.9', '7.3', '0.6', '13,644', '17,013', '-19.8%', '7.8', '7.2', '0.6', '122,920', '128,982', '-4.7%'], ['HYUNDAI', '7.8', '6.1', '1.7', '13,416', '14,219', '-5.6%', '7.4', '6.6', '0.8', '117,451', '118,438', '-0.8%'], ['GM Group', '7.2', '9.9', '(2.7)', '12,340', '23,031', '-46.4%', '7.9', '9.2', '(1.3)', '125,317', '165,771', '-24.4%'], ['OPEL', '2.5', '3.0', '(0.5)', '4,328', '6,933', '-37.6%', '2.7', '2.9', '(0.2)', '42,768', '53,077', '-19.4%'], ['CHEVROLET', '4.6', '6.9', '(2.3)', '7,952', '15,984', '-50.3%', '5.2', '6.2', '(1.0)', '81,701', '111,671', '-26.8%'], ['CADILLAC', '0.0', '0.0', '(0.0)', '60', '114', '-47.4%', '0.1', '0.1', '(0.0)', '848', '1,023', '-17.1%'], ['GAZ LCV', '3.0', '3.3', '(0.3)', '5,177', '7,538', '-31.3%', '2.7', '2.9', '(0.2)', '42,475', '52,963', '-19.8%'], ['MERCEDES-', '2.8', '1.9', '0.9', '4,782', '4,450', '7.5%', '2.3', '1.7', '0.6', '36,904', '30,839', '19.7%'], ['smart', '0.0', '0.0', '0.0', '32', '10', '220.0%', '0.0', '0.0', '0.0', '218', '118', '84.7%'], ['MITSUBISHI', '2.4', '2.6', '(0.2)', '4,200', '6,127', '-31.5%', '2.9', '2.8', '0.1', '46,157', '49,789', '-7.3%'], ['UAZ', '2.3', '1.7', '0.6', '3,894', '3,857', '1.0%', '1.7', '1.8', '0.1', '26,454', '32,998', '-19.8%'], ['FORD', '2.2', '3.9', '(1.7)', '3,852', '8,938', '-56.9%', '2.5', '3.9', '(1.4)', '39,670', '69,354', '-42.8%'], ['MAZDA', '2.2', '1.6', '0.6', '3,705', '3,700', '0.1%', '2.0', '1.5', '0.5', '31,249', '27,142', '15.1%'], ['PSA PEUGEOT', '1.4', '2.3', '(0.9)', '2,470', '5,347', '-53.8%', '1.8', '2.4', '(0.6)', '28,437', '42,583', '-33.2%'], ['PEUGEOT', '0.7', '1.2', '(0.5)', '1,238', '2,788', '-55.6%', '0.9', '1.3', '(0.4)', '14,744', '23,252', '-36.6%'], ['CITRO\xd0\x81N', '0.7', '1.1', '(0.4)', '1,232', '2,559', '-51.9%', '0.9', '1.1', '(0.2)', '13,693', '19,331', '-29.2%'], ['DAEWOO', '1.4', '2.3', '(0.9)', '2,443', '5,403', '-54.8%', '1.9', '2.0', '(0.1)', '29,303', '36,585', '-19.9%'], ['\x0cBMW Group', '1.3', '1.2', '0.1', '2,282', '2,698', '-15.4%', '1.6', '1.5', '0.1', '24,981', '27,071', '-7.7%'], ['BMW', '1.3', '1.1', '0.2', '2,182', '2,469', '-11.6%', '1.5', '1.4', '0.1', '23,917', '25,258', '-5.3%'], ['MINI', '0.1', '0.1', '(0.0)', '100', '229', '-56.3%', '0.1', '0.1', '0.0', '1,064', '1,813', '-41.3%'], ['LIFAN', '1.1', '1.1', '(0.0)', '1,901', '2,646', '-28.2%', '0.9', '0.9', '0.0', '13,912', '16,729', '-16.8%'], ['JAGUAR LAND', '1.0', '0.8', '0.2', '1,694', '1,854', '-8.6%', '0.9', '0.8', '0.1', '14,761', '14,099', '4.7%'], ['LAND ROVER', '0.9', '0.7', '0.2', '1,567', '1,702', '-7.9%', '0.9', '0.7', '0.2', '13,653', '13,009', '5.0%'], ['JAGUAR', '0.1', '0.1', '0.0', '127', '152', '-16.4%', '0.1', '0.1', '0.0', '1,108', '1,090', '1.7%'], ['SSANGYONG', '1.0', '1.3', '(0.3)', '1,643', '2,934', '-44.0%', '1.0', '1.2', '(0.2)', '15,487', '22,450', '-31.0%'], ['HONDA Group', '0.8', '1.0', '(0.2)', '1,441', '2,303', '-37.4%', '0.9', '0.9', '0.0', '14,274', '16,823', '-15.2%'], ['HONDA', '0.8', '1.0', '(0.2)', '1,363', '2,303', '-40.8%', '0.9', '0.9', '0.0', '13,787', '16,823', '-18.0%'], ['ACURA', '0.0', '-', '-', '78', '-', '-', '0.0', '-', '-', '487', '-', '-'], ['GREAT WALL', '0.8', '0.5', '0.3', '1,292', '1,230', '5.0%', '0.7', '0.7', '0.0', '10,695', '13,352', '-19.9%'], ['SUZUKI', '0.7', '1.3', '(0.6)', '1,246', '2,957', '-57.9%', '0.8', '1.1', '(0.3)', '12,294', '19,329', '-36.4%'], ['VOLVO', '0.7', '0.5', '0.2', '1,234', '1,230', '0.3%', '0.7', '0.5', '0.2', '10,327', '9,637', '7.2%'], ['GEELY', '0.7', '1.2', '(0.5)', '1,226', '2,776', '-55.8%', '0.8', '1.0', '(0.2)', '11,897', '17,250', '-31.0%'], ['CHRYSLER', '0.7', '0.5', '0.2', '1,167', '1,191', '-2.0%', '0.6', '0.4', '0.2', '10,016', '8,046', '24.5%'], ['FIAT', '0.3', '0.3', '(0.0)', '519', '731', '-29.0%', '0.3', '0.3', '0.0', '4,760', '4,912', '-3.1%'], ['CHRYSLER', '0.0', '0.0', '(0.0)', '1', '19', '-94.7%', '0.0', '0.0', '0.0', '86', '133', '-35.3%'], ['JEEP', '0.4', '0.2', '0.2', '630', '427', '47.5%', '0.3', '0.2', '0.1', '5,090', '2,840', '79.2%'], ['DODGE', '0.0', '0.0', '(0.0)', '0', '14', '-', '0.0', '0.0', '0.0', '26', '161', '-83.9%'], ['ALFA ROMEO', '0.0', '-', '-', '17', '-', '-', '0.0', '-', '-', '54', '-', '-'], ['SUBARU', '0.6', '0.5', '0.1', '1,116', '1,189', '-6.1%', '0.7', '0.6', '0.1', '10,462', '11,118', '-5.9%'], ['CHERY', '0.6', '0.7', '(0.1)', '1,077', '1,601', '-32.7%', '0.7', '0.7', '0.0', '11,446', '13,126', '-12.8%'], ['PORSCHE', '0.2', '0.1', '0.1', '290', '269', '7.8%', '0.2', '0.1', '0.1', '2,847', '2,432', '17.1%'], ['FAW', '0.1', '0.2', '(0.1)', '230', '567', '-59.4%', '0.1', '0.2', '(0.1)', '2,164', '2,896', '-25.3%'], ['CHANGAN', '0.1', '-', '-', '102', '-', '-', '0.0', '-', '-', '665', '-', '-'], ['HAIMA', '0.0', '0.0', '0.0', '76', '51', '49.0%', '0.0', '0.0', '0.0', '493', '187', '163.6%'], ['BAW', '0.0', '0.1', '(0.1)', '68', '131', '-48.1%', '0.0', '0.1', '(0.1)', '788', '1,148', '-31.4%'], ['ISUZU', '0.0', '0.0', '0.0', '55', '25', '120.0%', '0.0', '0.0', '0.0', '308', '98', '214.3%'], ['FOTON', '0.0', '0.0', '0.0', '48', '0', '-', '0.0', '0.0', '0.0', '59', '6', '883.3%'], ['BRILLIANCE', '0.0', '-', '-', '46', '-', '-', '0.0', '-', '-', '278', '-', '-'], ['JAC', '0.0', '-', '-', '45', '-', '-', '0.0', '-', '-', '234', '-', '-'], ['TAGAZ', '0.0', '0.0', '0.0', '5', '29', '-82.8%', '0.0', '0.0', '0.0', '110', '311', '-64.6%'], ['ZAZ', '0.0', '0.1', '(0.1)', '3', '153', '-98.0%', '0.0', '0.1', '(0.1)', '481', '2,264', '-78.8%'], ['LUXGEN', '0.0', '-', '-', '2', '-', '-', '0.0', '-', '-', '79', '-', '-'], ['BYD', '0.0', '0.0', '(0.0)', '0', '2', '-', '0.0', '0.0', '0.0', '5', '102', '-95.1%'], ['IZH', '0.0', '0.0', '(0.0)', '0', '25', '-', '0.0', '0.0', '0.0', '19', '610', '-96.9%'], ['VORTEX', '0.0', '0.0', '(0.0)', '0', '34', '-', '0.0', '0.1', '(0.1)', '0', '923', '-'], ['BOGDAN', '0.0', '0.1', '(0.1)', '0', '147', '-', '0.0', '0.1', '(0.1)', '92', '1,678', '-94.5%'], ['SOLLERS Group', '3.3', '2.9', '0.4', '5,592', '6,816', '-18.0%', '2.7', '3.1', '(0.4)', '42,249', '55,546', '-23.9%'], ['ISUZU', '0.0', '0.0', '0.0', '55', '25', '120.0%', '0.0', '0.0', '0.0', '308', '98', '214.3%'], ['SSANGYONG', '1.0', '1.3', '(0.3)', '1,643', '2,934', '-44.0%', '1.0', '1.2', '(0.2)', '15,487', '22,450', '-31.0%'], ['UAZ', '2.3', '1.7', '0.6', '3,894', '3,857', '1.0%', '1.7', '1.8', '(0.1)', '26,454', '32,998', '-19.8%']]

Ниже пример ошибки, для ее исправления нужно исправить код в классе и проделать всю процедуру (кроме присвоения параметров In[16]) сначала.

In [42]:
A.tab3fromtxt(txtfile_path, csvfilename) 
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-42-db4cfed2389c> in <module>()
----> 1 A.tab3fromtxt(txtfile_path, csvfilename)

<ipython-input-40-50ace65b1fca> in tab3fromtxt(self, txtfile_path, csvfilename, csvfolder)
     59                     if line.split()[0].isdigit():
     60                         if (line.find('  ') != -1):
---> 61                             if (line.partition('  ')[2] != ['']) and (line.partition('  ')[0].split()[0]).isdigit():
     62                                 tline = []
     63                                 tline.append(line.partition('  ')[0])

IndexError: list index out of range

Если сразу не догадался, где ошибка, то можно взять фрагмент (строку) из исходного текстового файла и поэлементно проверить код:

In [43]:
line = "1   Granta      Lada    11,860  14,951   (3,091)      1       Granta         Lada       95,154           113,738  (18,584) "
In [44]:
line.partition('  ')
Out[44]:
('1',
 '  ',
 ' Granta      Lada    11,860  14,951   (3,091)      1       Granta         Lada       95,154           113,738  (18,584) ')
In [46]:
line.partition('  ')[0].isdigit()
Out[46]:
True
In [57]:
line.partition('  ')[0].split()[0].isdigit()
Out[57]:
True

Оказалось, что я просто переусердствовал со скобками, без них все работает. Однако, оставимся на упрощенном варианте In [46]

Меняем код, опять нажимаем три раза на кнопку Run (для трех вышеупомянутых ячеек) и получаем наконец:

In [49]:
A.tab3fromtxt(txtfile_path, csvfilename) 
[['1', 'Granta', 'Lada', '11,860', '14,951', '(3,091)', '1', 'Granta', 'Lada', '95,154', '113,738', '(18,584)'], ['2', 'Solaris', 'Hyundai', '9,086', '8,590', '496', '2', 'Solaris', 'Hyundai', '74,438', '75,081', '(643)'], ['3', 'New', 'Rio', 'KIA', '5,999', '7,159', '(1,160)', '3', 'New', 'Rio', 'KIA', '60,032', '59,046', '986'], ['4', 'Logan', 'Renault', '4,390', '4,012', '378', '4', 'Duster', 'Renault', '51,137', '53,611', '(2,474)'], ['5', 'Duster', 'Renault', '4,376', '5,553', '(1,177)', '5', 'Kalina', 'Lada', '44,175', '43,767', '408'], ['6', 'Kalina', 'Lada', '4,273', '2,897', '1,376', '6', 'Largus', 'Lada', '43,272', '35,083', '8,189'], ['7', 'Polo', 'VW', '3,979', '5,488', '(1,509)', '7', 'Polo', 'VW', '40,505', '47,208', '(6,703)'], ['8', 'Almera', 'Nissan', '3,822', '1,370', '2,452', '8', 'Logan', 'Renault', '34,725', '34,192', '533'], ['9', 'Largus', 'Lada', '3,554', '5,514', '(1,960)', '9', 'Priora', 'Lada', '31,636', '41,440', '(9,804)'], ['10', 'Priora', 'Lada', '3,354', '4,677', '(1,323)', '10', 'Almera', 'Nissan', '31,157', '5,854', '25,303'], ['11', 'Camry', 'Toyota', '2,729', '2,767', '(38)', '11', 'Niva', 'Chevrolet', '26,106', '34,062', '(7,956)'], ['12', '4x4', 'Lada', '2,716', '5,885', '(3,169)', '12', 'Octavia', 'A7', 'Skoda', '24,714', '2,679', '22,035'], ['13', 'RAV', '4', 'Toyota', '2,709', '3,542', '(833)', '13', 'RAV', '4', 'Toyota', '24,077', '26,931', '(2,854)'], ['14', 'Octavia', 'A7', 'Skoda', '2,663', '922', '1,741', '14', '4x4', 'Lada', '23,997', '31,205', '(7,208)'], ['15', 'Niva', 'Chevrolet', '2,562', '4,246', '(1,684)', '15', 'Sandero', 'Renault', '23,865', '28,946', '(5,081)'], ['16', 'Qashqai', 'Nissan', '2,537', '3,289', '(752)', '16', 'ix35', 'Hyundai', '22,602', '20,883', '1,719'], ['17', 'New', "Cee'd", 'KIA', '2,536', '2,905', '(369)', '17', 'Camry', 'Toyota', '22,038', '23,232', '(1,194)'], ['18', 'Sandero', 'Renault', '2,452', '2,902', '(450)', '18', 'Cruze', 'Chevrolet', '20,808', '37,590', '(16,782)'], ['19', 'Rapid', 'Skoda', '2,430', '0', '2,430', '19', 'Qashqai', 'Nissan', '19,910', '22,937', '(3,027)'], ['20', 'ix35', 'Hyundai', '2,277', '2,820', '(543)', '20', 'Corolla', 'Toyota', '19,831', '17,265', '2,566'], ['21', 'Corolla', 'Toyota', '2,258', '2,822', '(564)', '21', 'Focus', 'Ford', '18,661', '45,750', '(27,089)'], ['22', 'Cruze', 'Chevrolet', '2,039', '6,294', '(4,255)', '22', 'New', "Cee'd", 'KIA', '18,629', '21,640', '(3,011)'], ['23', 'Sportage', 'KIA', '2,022', '2,801', '(779)', '23', 'Sportage', 'KIA', '18,527', '21,831', '(3,304)'], ['24', 'Patriot', 'UAZ', '1,963', '1,427', '536', '24', 'Astra', 'Opel', '16,539', '26,346', '(9,807)'], ['25', 'CX-5', 'Mazda', '1,790', '1,789', '1', '25', 'CX-5', 'Mazda', '15,047', '11,575', '3,472']]

Теперь убираем отладочную печать, раскоментируем строки и записываем результаты в папки 1aug, 2aug. 3aug

In []:
# Было при отладке
#csvfile_path = csvfolder + '\\3\\' + csvfilename
#self.tocsv(t3, csvfile_path)
print t3
In []:
# Стало (см выше в трез подпрограммах)
csvfile_path = csvfolder + '\\3aug\\' + csvfilename
self.tocsv(t3, csvfile_path)
#print t3

Вручную создаем папки 1aug, 2aug. 3aug

In [56]:
# Запускаем на выполнение
A.alltxt2csv()


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий