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
我在过去几个月阅读了大量信息后才加入这里,因为我得到了 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