【问题标题】:Python: Keep track of current column in text filePython:跟踪文本文件中的当前列
【发布时间】:2012-06-07 21:39:21
【问题描述】:

这里是 Python 初学者。 我正在逐列遍历文本文件。

for line in Input:
    line = line.rstrip() 
    fields = line.split("\t")   
    for col in fields[5:]:

在遍历列时如何跟踪我所在的列?我想在输出中打印当前相关的列,所以当我得到结果时,我知道结果指的是哪一列。 这似乎有一个明显的答案,但我不知道!

提前感谢您的帮助。我发现这里的人们乐于助人。

一些输入/输出示例:

输入文件中的行:

 chr20   1032    .       A     1/1 1/1 1/1 0/1 0/0
 chr20   1326    .       T     1/1 1/1 1/1 0/1 0/0
 chr20   1388    .       C     0/0 1/1 ./. 0/1 0/0

然后我通过这些行查看第 5 列,例如 1/1、1/1、0/0 并计算一些输出统计信息。我的输出文件包含使用第 5 列计算的每 x 行的统计信息。 我希望我的输出文件还包括第 6、7 列等的结果,并且输出文件中的行告诉我数据是从哪一列计算出来的。本质上是为了节省我为每一列单独重新运行脚本。

输出示例:

5   chr1    230344070   231345012   1000942 200720  66560   119841  7160    5.63775088385   94.3622491161
5   chr1    231345012   232345029   1000017 167920  55040   106160  3360    3.06793279766   96.9320672023
5   chr1    232345029   233345195   1000166 179280  64841   96079   9180    8.72134449311   91.2786555069

这里的第一列指的是它是根据第 5 列中的值计算的事实

for index, col in enumerate(fields[5:]):

最好的,

鲁巴尔

【问题讨论】:

  • 既然你在看染色体,你可能会对Biopython这个包感兴趣

标签: python file loops


【解决方案1】:

你可以试试这样的

for i,col in enumerate(fields[5:], 5):
    ....

enumerate() 将为您生成一个索引值,默认情况下它以 0 开头,除非将起始值指定为 enumerate() 的第二个参数,如上图 5 所示。

变量 i 将从值 5 开始,并允许您跟踪正在处理的当前列以及 col(如前所述)该列中字段的值。

或者,为了方便和更容易修改,您可以使用变量:

start_col = 5
for i,col in enumerate(fields[start_col:], start_col):
    ....

--- 更新回复下面的cmets

我仍然不太确定我是否理解您的评论,但如果您发布的循环位于更大的循环内,您可以像这样跟踪您当前的列:

cur_column = 5
for line in Input:
    line = line.rstrip() 
    fields = line.split("\t")   
    for col in fields[cur_colum:]:
       ...
       ...

cur_column += 1 # done processing current column, increment value to next column

如果您的代码太大而无法发布,发布一些简单的输入/输出示例会有所帮助。如果没有更多信息,很难真正知道如何提供帮助。我希望这会有所帮助。

【讨论】:

  • 这些用于标记第一列的输出,但输出仅来自第一列。我希望输出文件包含所有列的结果。我正在输出 'print >> output, str(i)'
  • @user964689 我不确定我是否理解,也许您可​​以提供一些输入/输出示例?您不采取完整的行并将其分解为基于\t 的字段吗?这将允许您获取(并根据需要标记)行中的每个字段。
  • 我的代码很长,所以我想我不能打印出来。我将尝试简洁地解释:我将文本文件拆分为制表符分隔的字段。然后对于一个特定的列,我遍历文件中的所有行,并根据几行的累积值计算一些统计数据。现在我希望脚本对文本文件中的其他列执行相同的操作。然后将结果输出到一个大的输出文件,其中包含有关结果引用哪一列的相关信息。所以目前只有第 5 列的输出。我希望它遍历所有列
  • 也许我应该将 for col in fields 循环放在输入循环中 for 行的上方?
  • 我认为,如果在 cur_column 更新为 +=1 后我可以让它循环返回,它将起作用。为此,我必须在循环内缩进它吗?目前我认为它会通读并将列更新为 6,然后结束。
【解决方案2】:

可以使用内置函数enumerate

for index, col in enumerate(fields[5:]):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2017-03-15
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多