Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取python中的文本文件并提取每行中的特定值?_Python_Python 3.x - Fatal编程技术网

读取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)