读取python中的文本文件并提取每行中的特定值?
我有一个文本文件,每行内容如下:读取python中的文本文件并提取每行中的特定值?,python,python-3.x,Python,Python 3.x,我有一个文本文件,每行内容如下: n:1 mse_avg:8.46 mse_y:12.69 mse_u:0.00 mse_v:0.00 psnr_avg:38.86 psnr_y:37.10 psnr_u:inf psnr_v:inf n:2 mse_avg:12.20 mse_y:18.30 mse_u:0.00 mse_v:0.00 psnr_avg:37.27 psnr_y:35.51 psnr_u:inf psnr_v:inf 我需要读取每一行提取psnr_y及其在矩
n:1 mse_avg:8.46 mse_y:12.69 mse_u:0.00 mse_v:0.00 psnr_avg:38.86 psnr_y:37.10 psnr_u:inf psnr_v:inf
n:2 mse_avg:12.20 mse_y:18.30 mse_u:0.00 mse_v:0.00 psnr_avg:37.27 psnr_y:35.51 psnr_u:inf psnr_v:inf
我需要读取每一行提取psnr_y及其在矩阵中的值。python还有其他读取文本文件的函数吗?我需要从每一行提取psnr_y。我有一个matlab代码,但是我需要一个python代码,我不熟悉python中的函数。你能帮我解决这个问题吗?
这是matlab代码:
opt = {'Delimiter',{':',' '}};
fid = fopen('data.txt','rt');
nmc = nnz(fgetl(fid)==':');
frewind(fid);
fmt = repmat('%s%f',1,nmc);
tmp = textscan(fid,fmt,opt{:});
fclose(fid);
fnm = [tmp{:,1:2:end}];
out = cell2struct(tmp(:,2:2:end),fnm(1,:),2)
使用正则表达式
r'psnr_y:([\d.]+)'
每行读
并从结果中提取match.group(1)
如果需要,转换为浮点:float(匹配组(1))
为了验证
python script_name.py < /path/to/your/dataset.txt
python脚本_name.py
由于我讨厌正则表达式,我建议:
s='n:1 mse_平均值:8.46 mse_y:12.69 mse_:0.00 psnr_平均值:38.86 psnr_y:37.10 psnr_:inf psnr_v:inf\nn:2 mse_平均值:12.20 mse_y:18.30 mse_:0.00 psnr_平均值:37.27 psnr_y:35.51
lst=s.split('\n')
out=[]
对于lst中的线:
psnr_y_pos=行索引('psnr_y:'))
下一个键=行[psnr\U y\U位置:]索引(“”)
psnr_y=行[psnr_y_pos+7:psnr_y_pos+下一个_键]
out.追加(psnr__y)
打印(输出)
out
是每行中psnr\u y
值的列表。您可以使用如下正则表达式:
import re
with open('textfile.txt') as f:
a = f.readlines()
pattern = r'psnr_y:([\d.]+)'
for line in a:
print(re.search(pattern, line)[1])
此代码将仅返回psnr_y的值。您可以删除[1]并将其更改为[0]以获得完整字符串,如“psnr_y:37.10”。
如果要将其分配到列表中,代码如下所示:
import re
a_list = []
with open('textfile.txt') as f:
a = f.readlines()
pattern = r'psnr_y:([\d.]+)'
for line in a:
a_list.append(re.search(pattern, line)[1])
要获得无需导入其他模块的简单答案,您可以尝试:
rows = []
with open("my_file", "r") as f:
for row in f.readlines():
value_pairs = row.strip().split(" ")
print(value_pairs)
values = {pair.split(":")[0]: pair.split(":")[1] for pair in value_pairs}
print(values["psnr_y"])
rows.append(values)
print(rows)
这将为您提供一个字典列表(基本上是JSON结构,但带有python对象)。
这可能不是最快的解决方案,但结构很好,不必使用正则表达式
rows = []
with open("my_file", "r") as f:
for row in f.readlines():
value_pairs = row.strip().split(" ")
print(value_pairs)
values = {pair.split(":")[0]: pair.split(":")[1] for pair in value_pairs}
print(values["psnr_y"])
rows.append(values)
print(rows)