处理来自多个文本文件的数据

时间:2016-10-17 06:16:45

标签: python scripting

有关如何从多个文本文件中获取数据并处理它们(例如计算总计)的任何建议。 我一直在尝试用Python做这件事但继续遇到死胡同。

每次进行操作时,机器都会以文本格式生成摘要文件,例如,批量筛选好苹果。首先你加载苹果,然后好与坏分开,然后你可以重新加载坏苹果重新测试它们,一些恢复。因此,每批生成至少2个摘要文件,具体取决于加载苹果以恢复良好的次数。

这是文本文件的示例:

文件1:

general Info:
    Batch No.        : A2J3
    Operation        : Test
    Fruit            : Apple
    Operation Number : A5500
    Quantity In      : 10
yield info:
    S1   S2     Total    Bin Name
     5    2       7      good
     1    2       3      bad

file2的:

general Info:
    Batch No.        : A2J3
    Operation        : Test
    Fruit            : Apple
    Operation Number : A5500
    Quantity In      : 3
yield info:
    S1   S2     Total    Bin Name
     1    1       2      good
     0    0       1      bad

我希望将数据放在一个包含这些txt文件的文件夹中,并将测试结果与以下条件合并:

  1. 通过识别哪个txt文件来自同一批号,同一操作(基于txt文件的内容而不是文件名)来处理同一批次

  2. 将2(或更多摘要文件)数据合并为以下格式csv:

    Lot:
    Operation:
    Bin     First Pass Second Pass  Final Yield    %Yield
    Good       7            2           9            90%
    Bad        3            1           1            10%
    
  3. S1,S2是可变的,它可以从1到14但从不小于1。 垃圾箱也可以在不同的文本文件上有几种类型(不仅限于好的和坏的。但总是只有一个好的垃圾箱)

    Bins:
     Good
     Semi-bad
     Bad
     Worst
     ...
    

    我是Python的新手,我只在学校使用这种脚本语言,我只知道基础知识,仅此而已。 所以我想要做的任务对我来说有点压倒性,所以我开始处理单个文本文件并获取我想要的数据,例如:批号

    with open('R0.txt') as fh_d10SunFile:
        fh_d10SumFile_perline = fh_d10SunFile.read().splitlines()
        #print fh_d10SumFile_perline
    
    TestProgramName_str = fh_d10SumFile_perline[CONST.TestProgram_field].split(':')[1]
    LotNumber_str       = fh_d10SumFile_perline[CONST.LotNumber_field].split(':')[1]
    QtyIn_int           = int( fh_d10SumFile_perline[CONST.UnitsIn_field].split(':')[1] )
    TestIteration_str   = fh_d10SumFile_perline[CONST.TestIteration_field].split(':')[1]
    TestType_str        = fh_d10SumFile_perline[CONST.TestType_field].split(':')[1]
    

    然后抓取该摘要文件中的所有分档:

    SoftBins_str = filter( lambda x: re.search(r'bin',x),fh_d10SumFile_perline)
    for index in range( len(SoftBins_str) ):
        SoftBins_data_str = [l.strip() for l in SoftBins_str[index].split(' ') if l.strip()]
        SoftBins_data_str.reverse()
        bin2bin[SoftBins_data_str[0]] = SoftBins_data_str[2]
    

    然后我卡住了,因为我不知道如何使用包含n个站点(S1,S2)的几个n文本文件进行读取和解析。 我如何从n个文本文件中获取这些信息,在内存中处理它们(这甚至可以用python实现),然后在csv输出文件中用计算写出输出。

1 个答案:

答案 0 :(得分:1)

以下内容可帮助您入门。由于您的文本文件是固定格式,因此读取它们并解析它们相对简单。此脚本搜索当前文件夹中的所有文本文件,读取每个文件并根据批次名称将批次存储在字典中,以便将同一名称区域的所有批次组合在一起。

处理完所有文件后,它会为每个批处理创建摘要,并将它们写入单个csv输出文件。

$sql = 'INSERT INTO data '.
          '(lic_no, speed, location) '. 'VALUES ("'.$lic_no.'", "'.$speed.'", "'.$location.'" )';

为您提供制表符分隔的from collections import defaultdict import glob import csv batches = defaultdict(list) for text_file in glob.glob('*.txt'): with open(text_file) as f_input: rows = [row.strip() for row in f_input] header = [rows[x].split(':')[1].strip() for x in range(1, 6)] bins = {} for yield_info in rows[8:]: s1, s2, total, bin_name = yield_info.split() bins[bin_name] = [int(s1), int(s2), int(total)] batches[header[0]].append(header + [bins]) with open('output.csv', 'wb') as f_output: csv_output = csv.writer(f_output, delimiter='\t') for batch, passes in batches.items(): bins_output = defaultdict(lambda: [[], 0]) total_yield = 0 for lot, operation, fruit, op_num, quantity, bins in passes: for bin_name, (s1, s2, total) in bins.iteritems(): bins_output[bin_name][0].append(total) bins_output[bin_name][1] += total total_yield += total csv_output.writerows([['Lot:', lot], ['Operation:', operation]]) csv_header = ["Bin"] + ['Pass {}'.format(x) for x in range(1, 1 + len(passes))] + ["Final Yield", "%Yield"] csv_output.writerow(csv_header) for bin_name in sorted(bins_output.keys()): entries, total = bins_output[bin_name] percentage_yield = '{:.1f}%'.format((100.0 * total) / total_yield) csv_output.writerow([bin_name] + entries + [total, percentage_yield]) csv_output.writerow([]) # empty row to separate batches 文件,如下所示:

csv

注意,脚本已更新以处理任意数量的bin类型。

相关问题