Python:从文本文件的条目中创建一个十进制数

Python:从文本文件的条目中创建一个十进制数,python,file,parsing,text,binary,Python,File,Parsing,Text,Binary,我有一个包含类似以下示例的条目的文本文件: # 8 rows of header --------------------------------------------- 123 ABC12345 A some more variable length text 456 DEF12345 A some more variable length text 789 GHI12345 B some more variable length text 987 JKL12345 A some more

我有一个包含类似以下示例的条目的文本文件:

# 8 rows of header --------------------------------------------- 123 ABC12345 A some more variable length text 456 DEF12345 A some more variable length text 789 GHI12345 B some more variable length text 987 JKL12345 A some more variable length text 654 MNO12345 B some more variable length text 321 PQR12345 B some more variable length text etc... #8行标题 --------------------------------------------- 123 ABC12345 A更多可变长度文本 456 DEF12345 A更多可变长度文本 789 GHI12345 B更多可变长度文本 987 JKL12345 A更多可变长度文本 654 MNO12345 B更多可变长度文本 321 PQR12345 B更多可变长度文本 等 我希望达到的目标是:

  • 将As转换为1s,将Bs转换为0s,以获得二进制数 对于上述示例,这将是110100(即AABABB)
  • 将这个二进制数转换成十进制数 对于上面的例子,这将是52
  • 将此十进制数映射到文本字符串 (即52=“案例1”或53=“案例2”等)以及
  • 将此打印在标准输出上
  • 我有一点Python经验,但上面的问题远远超出了我的能力。因此,任何来自社区的帮助都将不胜感激。 多谢各位, Hib

    一些指针(假设Python 2):

    翻译字符串:

    >>> import string
    >>> table = string.maketrans("AB","10")
    >>> translated = "AABABB".translate(table)
    >>> translated
    '110100'
    
    转换为基数10:

    >>> int(translated, 2)
    52
    
    不知道如何将其映射到那些任意字符串-需要更多信息


    打印到
    stdout
    -真的吗?您对哪个部分有问题?

    类似的功能应该可以使用(未测试):

    我将为您分解缩进的代码行并解释它

    • 空字符串的
      join
      方法将连接参数中给定的字符串,因此
      “”。join([“A”、“B”、“C”])
      等于
      “ABC”
    • 我们将所谓的,
      X传递给Z中的Y
      。它的语法与a相同,只是省略了方括号
    • 该函数返回一个迭代器,该迭代器悄悄跳过文件对象
      f
      的前9行,因此它生成从第10行开始的行
    • 不带参数的
      str
      split
      方法将在任何空格字符序列(空格、制表符(
      “\t”
      )、换行符(
      “\n”
      )和回车符(
      “\r”
      )上拆分,并返回列表。例如,
      “a\tb\n\tc\n”.split()
      等于
      ['a','b','c']
      。我们对第三列感兴趣,
      x.split()[2]
      ,它要么是
      “A”
      ,要么是
      “B”
    • 二进制映射
      字典中查找此值将为我们提供
      “1”
      “0”
    a.txt:

    # 8 rows of header
    
    
    
    
    
    
    
    123 ABC12345 A some more variable length text
    456 DEF12345 A some more variable length text
    789 GHI12345 B some more variable length text
    987 JKL12345 A some more variable length text
    654 MNO12345 B some more variable length text
    321 PQR12345 B some more variable length text
    
    您可以尝试以下方法:

    >>> int(''.join([line.split(' ')[2] for line in open('a.txt', 'r').readlines()[8:]]).replace('A', '1').replace('B', '0'), 2)
    >>> 52
    
    至于将int映射到字符串,我不确定你的意思

    >>> value = {int(''.join([line.split(' ')[2] for line in open('a.txt', 'r').readlines()[8:]]).replace('A', '1').replace('B', '0'), 2): 'case 52'}  
    >>> value[52]
    'case 52'
    >>> 
    

    我使用
    re
    模块检查要接受的行的格式:

    >>> def map_file_to_string(string):
        values = []
        for line in string.split('\n'):
            if re.match(r'\d{3} \w{3}\d{5} [AB] .*', line):
                values.append(1 if line[13] == 'A' else 0)
        return dict_map[int(''.join(map(str, values)), 2)]
    
    >>> dict_map = {52: 'Case 1', 53: 'Case 2'}
    >>> s1 = """# 8 rows of header
    ---------------------------------------------
    123 ABC12345 A some more variable length text
    456 DEF12345 A some more variable length text
    789 GHI12345 B some more variable length text
    987 JKL12345 A some more variable length text
    654 MNO12345 B some more variable length text
    321 PQR12345 B some more variable length text
    etc.."""
    >>> map_file_to_string(s1)
    'Case 1'
    >>> 
    

    在找到解决方案之前,您需要完成问题的定义。我将使用
    itertools.islice
    跳过前8行。非常感谢大家,尤其是对代码的解释。这非常有帮助。我最终成功地让脚本运行起来,并产生了我所需要的输出。将所有内容都放在一行并不是你的主要目标:)@TimPietzcker lol是的,我想我这样做是出于习惯,因为它往往很受欢迎,但这是非常糟糕的借口,我可能只是痴迷于python允许我做这样的事情;)
    >>> def map_file_to_string(string):
        values = []
        for line in string.split('\n'):
            if re.match(r'\d{3} \w{3}\d{5} [AB] .*', line):
                values.append(1 if line[13] == 'A' else 0)
        return dict_map[int(''.join(map(str, values)), 2)]
    
    >>> dict_map = {52: 'Case 1', 53: 'Case 2'}
    >>> s1 = """# 8 rows of header
    ---------------------------------------------
    123 ABC12345 A some more variable length text
    456 DEF12345 A some more variable length text
    789 GHI12345 B some more variable length text
    987 JKL12345 A some more variable length text
    654 MNO12345 B some more variable length text
    321 PQR12345 B some more variable length text
    etc.."""
    >>> map_file_to_string(s1)
    'Case 1'
    >>>