0

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

# 8行表头
---------------------------------------------
123 ABC12345 一个更可变长度的文本
456 DEF12345 更多可变长度的文本
789 GHI12345 B 更多可变长度文本
987 JKL12345 更多可变长度文本
654 MNO12345 B 更多可变长度文本
321 PQR12345 B 更多可变长度文本
ETC...

我想要实现的是:

  1. 将 As 转换为 1,将 Bs 转换为 0,以便获得二进制数 对于上面的示例,这将是 110100(即 AABABB)
  2. 将此二进制数转换为十进制数对于上面的示例,这将是 52
  3. 将此十进制数映射到文本字符串(即 52 = "Case 1" 或 53 = "Case 2" 等)和
  4. 在标准输出上打印

我有一点 Python 经验,但上面的问题超出了我的能力范围。因此,社区的任何帮助将不胜感激。非常感谢提前, Hib

4

4 回答 4

2

一些指针(假设 Python 2):

翻译一个字符串:

>>> import string
>>> table = string.maketrans("AB","10")
>>> translated = "AABABB".translate(table)
>>> translated
'110100'

转换为基数 10:

>>> int(translated, 2)
52

不知道如何将其映射到那些任意字符串 - 需要更多信息。

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

于 2012-07-11T09:04:50.590 回答
0

像这样的东西应该可以工作(未经测试):

from itertools import islice

binary_map = dict(zip("AB", "10"))  # Equivalent to {"A": "1", "B": "0"}
string_map = {52: "Case 1", 53: "Case 2"}

with open("my_text_file") as f:
    binary_str = "".join(binary_map[x.split()[2]] for x in islice(f, 9, None))

binary_value = int(binary_string, 2)
print string_map[binary_value]

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

  • join空字符串的方法将连接参数中给出的字符串,因此"".join(["A", "B", "C"])等于"ABC"
  • 我们向这个方法传递一个所谓的生成器表达式, X for Y in Z它与列表推导具有相同的语法,只是省略了方括号。
  • islice函数返回一个迭代器,它默默地跳过文件对象的前 9 行f,因此它产生从第 10 行开始的行。
  • 不带参数的split方法str将拆分任何空白字符序列(空格、制表符("\t")、换行符("\n")和回车符("\r"))并返回一个列表。例如," a \t b\n\t c\n".split()等于['a', 'b', 'c']。我们对第三列感兴趣x.split()[2],它是"A""B"
  • 在字典中查找这个值binary_map会给我们一个"1"或一个"0"
于 2012-07-11T09:06:24.130 回答
0

一个.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'
>>> 
于 2012-07-11T09:09:01.373 回答
0

我使用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'
>>> 
于 2012-07-11T09:19:24.133 回答