gpt4 book ai didi

python - 在 Python 中返回多个参数

转载 作者:行者123 更新时间:2023-12-04 23:14:47 27 4
gpt4 key购买 nike

我正在尝试使用函数重写我的一个脚本。它正在分析目录中的几个传输流文件,然后使用 ffprobe 返回所有 TS 文件的 GoP 大小,并将 json 文件写入日志目录。所以这最初是我的脚本,它工作得很好:

#!/usr/bin/env python
import subprocess
import json
import os.path

recdir = "/home/user/recordings/"
logdir = "/home/user/logs/"


for input_file in os.listdir(recdir):
gop_list = []
p = 0
fname = os.path.splitext(input_file)[0]
if input_file.endswith(".ts"):
abs_file = recdir + "/" + input_file
# Execute the ffprobe command for analysing the GoP Structure
gop_data = subprocess.check_output(['ffprobe', '-v', 'quiet', '-read_intervals', "%+10", '-print_format', 'json', '-select_streams', 'v', '-show_frames', '-show_entries', 'frame=coded_picture_number,key_frame,pict_type', abs_file])
# print gop_data
# Write output to a file
out = open("{}_gop_data.json".format(fname), "w+")
out.write(gop_data)
out.close
#End of writing
# Loading the json file
gop = json.loads(gop_data.decode('utf-8'))
print "-------------------------- GoP information for {} ------------------------------".format(input_file)
print
# Calculating the GoP length of the video(difference between two IDR frames)
for i in range(len(gop["frames"])):
if (gop["frames"][i]["pict_type"]) == "I" and (gop["frames"][i]["key_frame"] == 1):
gop_list.append(i)
p += 1
# Printing the first 5 results if present
for r in range(1, p):
print "GoP frame length Nr: {0} is: {1}".format(r, (gop_list[r] - gop_list[r-1] + 1))
print

for i in range(len(gop["frames"])):
if (gop["frames"][i]["pict_type"]) == "I" and (gop["frames"][i]["key_frame"] == 1):
gop_list.append(i)
p += 1

我想从中创建 3 个功能。一种是执行 ffprobe 命令并将输出保存到变量“gop”。另一种是将json输出写入不同的文件,第三种是将数据呈现到命令行。当前的问题是第一个函数正在返回 gop 参数,但它只返回最后一个。请记住,这些文件非常大。所以我想我需要同时返回文件的名称和相应的 GoP 文件,并将这些数据用于其他两个函数(write_gop_data 和 iframe_calculator),但我不确定我该怎么做。
#!/usr/bin/env python
import subprocess
import json
import os.path

recdir = "/home/user/recordings/"
logdir = "/home/user/logs/"

def reading_gop_data(input_directory):
for input_file in os.listdir(input_directory):
fname = os.path.splitext(input_file)[0]
if input_file.endswith(".ts"):
abs_file = recdir + input_file
# Execute the ffprobe command for analysing the GoP Structure
gop = subprocess.check_output(['ffprobe', '-v', 'quiet', '-read_intervals', "%+10", '-print_format', 'json', '-select_streams', 'v', '-show_frames', '-show_entries', 'frame=coded_picture_number,key_frame,pict_type', abs_file])
return gop

def write_gop_data(gop_data, input_directory, save_directory):
for input_file in os.listdir(input_directory):
fname = os.path.splitext(input_file)[0]
out = open("{}{}_gop.json".format(save_directory, fname), "w+")
out.write(gop_data)
out.close

def iframe_calculator(gop_data, input_directory):
for input_file in os.listdir(input_directory):
gop_list = []
p = 0
if input_file.endswith(".ts"):
gop_json = json.loads(gop_data.decode('utf-8'))
print "-------------------------- GoP information for {} ------------------------------".format(input_file)
print
# Calculating the GoP length of the video(difference between two IDR frames)
for i in range(len(gop_json["frames"])):
if (gop_json["frames"][i]["pict_type"]) == "I" and (gop_json["frames"][i]["key_frame"] == 1):
gop_list.append(i)
p += 1
# Printing the first 5 results if present
for r in range(1, p):
print "GoP frame length Nr: {0} is: {1}".format(r, (gop_list[r] - gop_list[r-1] + 1))
print


# reading_gop_data(recdir)
write_gop_data(reading_gop_data(recdir), recdir, logdir)
iframe_calculator(reading_gop_data(recdir), recdir)

最佳答案

在没有太多样板的情况下实现目标的一种方法是使用 yield 的组合。关键字和 tuple

例如,您可以将第一个函数中的最后一行更改为:

return gop

至:
yield (gop, abs_file)

这将允许您一次从函数返回多个值,并且每次执行此行时还将“生成”一个值。 'yield' 关键字的作用是将你的函数变成一个生成器。

此外,既然您正在返回文件名,您现在不再需要遍历其他两个函数中的输入目录,以便您可以删除 write_gop_data 中的以下行。和 iframe_calculator功能:
for input_file in os.listdir(input_directory):

然后,当您遍历记录数据时,您可以使用以下结构:
for gop_data in reading_gop_data(recdir):
gop, file_name = gop_data
print "Processing file: " + file_name
write_gop_data(gop, file_name, logdir)
iframe_calculator(gop, file_name)

在每次迭代中, gop_data变量由 reading_gop_data 填充函数,然后您可以将您的元组解压缩到执行其余处理所需的两个变量中。

关于python - 在 Python 中返回多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49148378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com