Python:从文本文件的条目中创建一个十进制数
我有一个包含类似以下示例的条目的文本文件: # 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更多可变长度文本 等 我希望达到的目标是: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
>>> 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”
- 我们将所谓的,
。它的语法与a相同,只是省略了方括号X传递给Z中的Y
- 该函数返回一个迭代器,该迭代器悄悄跳过文件对象
的前9行,因此它生成从第10行开始的行f
- 不带参数的
的str
方法将在任何空格字符序列(空格、制表符(split
)、换行符(“\t”
)和回车符(“\n”
)上拆分,并返回列表。例如,“\r”
等于“a\tb\n\tc\n”.split()
。我们对第三列感兴趣,['a','b','c']
,它要么是x.split()[2]
,要么是“A”
“B”
- 在
字典中查找此值将为我们提供二进制映射
或“1”
“0”
# 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'
>>>