Python csv模块错误:索引超出范围

2024-05-16 02:49:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV文件,我想从中提取列,但只从一些行中提取。看起来像这样:

gene_id, ENSDARG00000104632, gene_version, 2, gene_name, RERG

gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186

gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186

gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186

gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186

基本上我想要第2列和第6列,但只从第5列中有“gene_name”的行中。所以我想摘录:

^{pr2}$

(从那里开始有成千上万排)

我写的是:

import csv


with open('filename.csv', 'rb') as infh:
        reader = csv.reader(infh)
        for row in reader:
                if row[4] == 'gene_name':
                        print row[1, 5]

但是,它给了我一个错误:

File "./gene_name_grabber.sh", line 10, in if row[4] == 'gene_name': IndexError: list index out of range

我明白这个错误意味着我要求它查看一个大于行中索引数的索引数……但显然每行中有4个以上的索引。请帮忙?在

谢谢!在


Tags: csvnameinidifversion错误reader
3条回答

I want the 2nd and 6th column, but only from the rows which have "gene_name" in the 5th column.

我喜欢Python。但最自然的表达方式是

awk '$5 ~ /gene_name/ {print $2, $6}'

让我们回到python。这不是你想写的:

^{pr2}$

将其改为print(row[1], row[5])。在

有些行只有少量列。因此,您需要将row[4]row[5]的取消引用包装在一个if语句中,以验证它是否足够长:

    if len(row) > 5:
        ...

显然,有些行没有包含足够的列。试试这个:

import csv

with open('input.csv', 'r') as f:

    reader = csv.reader(f)

    for row in reader:
        try:
            if 'gene_name' in row[4]:
                print('%s, %s' % (row[1].strip(), row[5].strip()))
        except IndexError:
            continue

…输出:

ENSDARG00000104632, RERG

正如锑指出的,听起来好像您的数据中偶尔会丢失一些值,而csv无法轻松处理这些值。我建议使用像pandas这样的库,它有一个read_csv函数,可以处理丢失的值。以这些数据为例:

gene_id, ENSDARG00000104632, gene_version, 2, gene_name, RERG
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id,
gene_id, ENSDARG00000104632, gene_version, , transcript_id,
gene_id, ENSDARG00000104632, gene_version, 2, transcript_id, ENSDART00000166186

其内容如下:

^{pr2}$

屈服:

                    1                   5
0  ENSDARG00000104632                RERG
1  ENSDARG00000104632  ENSDART00000166186
2  ENSDARG00000104632  ENSDART00000166186
3  ENSDARG00000104632  ENSDART00000166186
4  ENSDARG00000104632  ENSDART00000166186
5  ENSDARG00000104632  ENSDART00000166186
6  ENSDARG00000104632  ENSDART00000166186
7  ENSDARG00000104632                 NaN
8  ENSDARG00000104632                 NaN
9  ENSDARG00000104632  ENSDART00000166186

如你所愿。在

但是,如果缺少数据(如本例中所示),则只需删除以下行:

selected_data.dropna()

哪些输出:

                    1                   5
1  ENSDARG00000104632  ENSDART00000166186
2  ENSDARG00000104632  ENSDART00000166186
3  ENSDARG00000104632  ENSDART00000166186
4  ENSDARG00000104632  ENSDART00000166186
5  ENSDARG00000104632  ENSDART00000166186
6  ENSDARG00000104632  ENSDART00000166186
9  ENSDARG00000104632  ENSDART00000166186

(但是,这可能不是您想要的。)

参考文献

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

相关问题 更多 >