2

我在过去几个月阅读了大量信息后才加入这里,因为我对 Python 有了一定的了解。

无论如何,我很新,并且一直在尽可能多地进行研究,但是大多数答案都超出了我的理解范围,并且似乎并没有完全满足我的需要。

从我所做的阅读来看,我不确定我是否应该熟悉 Panda,但我基本上需要对 ALE 文件进行简单的格式化、转换和重组。ALE 是一个简单的制表符分隔的列表文件,其中包含视频剪辑名称和元数据。标题位于第 8 行,内容数据位于第 11 行及以下。这是一个例子:

1 Heading
2 FIELD_DELIM   TABS
3 VIDEO_FORMAT  1080
4 AUDIO_FORMAT  48khz
5 FPS   23.976
6
7 Column
8 #### COLUMN HEADERS ####
9
10 Data
11 #### TAB DELIMITED DATA ####

现在,我们假设我的输入文件已预先格式化为删除第 1-7 行、第 9 行和第 10 行,所以我们只有一个标题行作为第 1 行,数据从第 2 行开始。

我使用该程序的第一个任务是将一整列数据转换为新格式,我可以正常工作,但前提是我专门针对我在没有标题的数据集中寻找的列。

for row in ale_file:
    row[3] = timecode_to_frames(row[3])
    print row

问题是,我并不总是知道数据存在于哪个列号(因为每个程序都会以不同的顺序输出元数据),但我知道标题名称是什么。不知何故,我需要读取标题行,当它找到名为“start”、“end”和“duration”的三个标题时,它会将这些列号传递给一个变量。然后,在上面的 for 循环中,我将能够在与标题匹配的行号上运行我的 timecode_to_frames 函数。

我觉得这应该很简单(如果我很糟糕,请原谅我):

for row in ale_file:
    for col in row:
        if col == 'start':
            start_col = ##column number##

然后在我现有的代码中,我可以调用变量:

for row in ale_file:
    row[start_col] = timecode_to_frames(row[start_col])
    print row

旁注:在我的 FOR 循环中,我是否需要显式跳过第 1 行,因为它只是一个标题,因为它没有函数所期望的格式正确的数据。也许将 for 循环嵌套在 while 循环之类的while row != 0:东西中?

任何帮助将不胜感激,谢谢!

4

2 回答 2

1

如果您只需要 columnHeader 以及相应的 columnValue,则可以在循环之前从文件中读取第一行(标题),并在循环内使用 zip(header, row) 获取 (columnHeader, columnValue) 的元组。

https://docs.python.org/2/library/functions.html#zip

于 2016-07-14T06:53:02.977 回答
0

看起来你需要的是numpy.genfromtxt()delimiter='\t'names=True

这里

您可以将生成器设置为返回字符串,然后根据名称(它将从列标题中提取)重新格式化列。

import numpy as np
output=np.genfromtxt(ale_file, dtypes='S8', names=True, delimiter='/t')[['start','end','duration']]
#output['start'].dtype='foo'                          #if it's an included dtype
#output['start']=timecode_to_frames(output['start'])  #if not

不涉及 for 循环!

于 2016-07-14T06:43:24.617 回答