使用python计算文件中单词之间的空格数?

时间:2013-03-13 02:35:13

标签: python parsing file-io delimiter cobol

我真的很亲密。我通读“number of space between each word”并确实提供了这一行:

counts = [(len(list(cpart))) for c,cpart in groupby(s) if c == ' ']

但我真的不明白......我明白了,或者我在假设,C是分隔符,S是你正在分组的,而你正在放置结果列表?(python,array是新的?)计数(S表示先前实例化的变量)

我如何确定这样的事情?

                                                  AMOUNT       DATE       
   NAME          ACCOUNT#         DISCOUNT         DUE         DUE

我正在创建一个程序,允许我查看随机创建的COBOL输出文件头并使用它来创建PIC(X)的关联。

示例解决方案输出将是:

  1. PIC X(30)VALUE SPACES。
  2. PIC X(6)VALUE“AMOUNT”。
  3. PIC X(8)VALUE SPACES。
  4. PIC X(4)VALUE“DATE”。
  5. 重要的部分是数字。我可以明确地确定字符串的长度,但是空间我不确定如何......

    这是我到目前为止表明我正在工作lol:

    from itertools import groupby
    from test.test_iterlen import len
    from macpath import split
    from lib2to3.fixer_util import String
    
    file = open("C:\\Users\\Joshua\\Desktop\\Practice\\cobol.cbl", 'r+')
    
    line1 = file.readline()
    split = line1.split()
    print (split)
    print ()
    
    counts = [(len(list(cpart))) for c,cpart in groupby(split) if c == ' ']
    
    print (counts)
    
    
    index = 0
    while index != split.__len__():
        if split[index].strip() != None:
            print ("PICX(" + ") VALUE " + "\"" + split[index] + "\".")
        elif counts[index] == None:
            print ("PICX(" + ") VALUE " + "\"" + split[index] + "\".") 
        index+=1
    

2 个答案:

答案 0 :(得分:3)

我首先解释第一行:

counts = [(len(list(cpart))) for c,cpart in groupby(s) if c == ' ']

s实际上是输入字符串。所以,要运行它,你可以从:

开始
s = "   NAME          ACCOUNT#         DISCOUNT         DUE         DUE"

groupby(s)返回元组的迭代器。该元组中的第一个值是输入字符串中的字符,第二个值是另一个(嵌套的)迭代器,它将迭代字符的重复值。放入list表格(为了说明),它看起来像这样:

groupby("hello!!!")
[('h', ['h']), ('e', ['e']), ('l', ['l', 'l']), ('o', ['o']), ('!', ['!', '!', '!'])]

因此,c不是分隔符,但它是保存字符串s中每个字符的变量,cpart是{{1}的所有连续值的迭代器}}。拨打c后,它会显示len(cpart)的列表(每个项目都相同!),该列表的长度是字符[c,c,c,...]重复的次数。通常它只是一个。例如,对于c中的'A',您将获得'NAMEc == A。但对于list(cpart) == ['A']NAME之间的空格,您将获得ACCOUNT#c == ' '

整个内部括号cpart == [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']意味着它生成一个列表,好像您要附加到[]循环中的列表一样,每个项的值是{{{}之前的表达式1}}。这里,它是for,它计算一个字符的重复实例列表的长度。因此,它将是一个列表,其中包含重复字符的次数。 for表示只有当该字符是空格时才会将项目添加到列表中。


以上将计算空格。要计算单词(例如,要获得PIC X(6)VALUE“AMOUNT”),您可以执行以下操作:

len(list(cpart))

其中if c == ' '(您已使用过)返回一个单词列表,这些单词之前是一个以空格分隔的字符串。

答案 1 :(得分:0)

像这样分解输出没有特别的意义。你好吗:

     05  FILLER (optional) PIC X(width-of-report) VALUE
     "                              AMOUNT        DATE             "(in column 72)
-                         ".

“ - ”位于第7列,显示字母数字文字的延续,不需要开头报价,但需要结束报价。

您创建的处理非常简单。你总是输出这三行,你要做的就是将你的数据“切”成59字节(第二行)和第三行的“其余”(不知道你的报告宽度)。