我正在尝试从文件中提取一些信息。该文件有许多行,如下面的
"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10] ......
我想在每行搜索名称和castime,如果找到我想在括号中打印该值 括号中的值在不同的行中发生变化。例如,在上面的行名称中是DNSCR,而casttime是2,3,6,8。但长度可能会 在下一行有所不同
我尝试过以下代码,但它总是会给我10个字符,但我只需要支架中的任何内容。
c_req = 10
keyword = ['"names":','"castime":']
with open('mylogfile.log') as searchfile:
for line in searchfile:
for key in keywords:
left,sep,right = line.partition(key)
if sep:
print key + " = " + (right[:c_req])
答案 0 :(得分:0)
这看起来就像json,每条线周围都有括号吗? 如果是这样,整个内容很容易解析:
import json
test = '{"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10]}'
result = json.loads(test)
print(result["names"], result["castime"])
如果匹配整个JSON文件,您还可以使用像pandas这样的库将整个文件读入数据框。
答案 1 :(得分:0)
使用正则表达式:
import re
# should contain all lines
lines = ['"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10]']
# more efficient in large files
names_pattern = re.compile('"names":\["(\w+)"\]')
castime_pattern = re.compile('"castime":\[(.+)\],?')
names, castimes = list(), list()
for line in lines:
names.append(re.search(names_pattern, line).group(1))
castimes.append(
[int(num) for num in re.search(castime_pattern, line).group(1).split(',')]
)
添加异常处理和文件打开/阅读
答案 2 :(得分:0)
鉴于mylogfile.log
:
"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10]
"names":["FOO", "BAR"],"actual_names":["RADIO_R"],"castime":[1, 2, 3]
使用正则表达式和here。
import ast
import re
keywords = ['"names":', '"castime":']
keywords_name = ['names', 'castime']
d = {}
with open('mylogfile.log') as searchfile:
for i, line in enumerate(searchfile):
d['line ' + str(i)] = {}
for key, key_name in zip(keywords, keywords_name):
d['line ' + str(i)][key_name] = ast.literal_eval(re.search(key + '\[(.*?)\]', line).group(1))
print(d)
#{ 'line 0': {'castime': (2, 4, 6, 8, 10), 'names': 'DNSCR'},
# 'line 1': {'castime': (1, 2, 3), 'names': ('FOO', 'BAR')}}
re.search(key + '\[(.*?)\]', line).group(1)
会在[]
之后抓住keys
之间的所有内容。
并ast.literal_eval()
将转换删除string
中无用的引号和空格,并在需要时自动创建tuples
。
我还使用enumerate
来跟踪它在日志文件中的哪些行。