Python CSV 查找字符串并将列号传递给变量

Python CSV find string and pass column number to variable

我在过去几个月阅读了大量信息后才加入这里,因为我得到了 Python 的理由。

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

根据我的阅读,我不确定是否应该熟悉 Panda,但我基本上需要对 ALE 文件进行简单的格式化、转换和 re-organization。 ALE 是一个简单的 tab-delimited 列表文件,其中包含视频剪辑名称和元数据。 header 位于第 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 行,所以我们只有 header 行作为第 1 行,数据从第 2 行开始.

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

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

问题是,我并不总是知道数据存在的列号(因为每个程序将以不同的顺序输出元数据)但我知道 header 名称是什么。我需要以某种方式读取 header 行,当它找到名为 "start"、"end" 和 "duration" 的三个 header 时,它将通过这些列数字到一个变量。然后,在上面的 for 循环中,我将能够 运行 我的 timecode_to_frames 函数在与 headers.

匹配的行号上

我觉得按照这些思路应该相当简单(如果我说得太离谱请原谅我):

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 行,因为它只是一个 header,因为它没有函数期望的格式正确的数据。也许将 for 循环嵌套在 while 循环中,例如 while row != 0: 之类的?

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

看来您需要的是 numpy.genfromtxt()delimiter='\t' 以及 names=True

here

您可以将生成器设置为 return 字符串,然后根据名称重新格式化 column-wise(它将从您的列 headers 中提取)。

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

不涉及循环!

如果你只需要 columnHeader 和相应的 columnValue,你可以在文件循环之前读取第一行 (header),并在循环内使用 zip(header, row) 来获取 (columnHeader, columnValue) 的元组。

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