6

Ahoy,我正在编写一个 Python 脚本来过滤一些大型 CSV 文件。

我只想保留符合我标准的行。

我的输入是以下格式的 CSV 文件

Locus         Total_Depth  Average_Depth_sample   Depth_for_17
chr1:6484996  1030         1030                   1030
chr1:6484997  14           14                     14
chr1:6484998  0            0                      0

我想返回 Total_Depth 为 0 的行。

我一直在关注这个答案来读取数据。但是我被困在试图解析行并拉出符合我条件的行。

这是我到目前为止的代码:

import csv

f = open("file path", 'rb')
reader = csv.reader(f) #reader object which iterates over a csv file(f)
headers = reader.next() #assign the first row to the headers variable
column = {} #list of columns
for h in headers: #for each header
    column[h] = []
for row in reader: #for each row in the reader object
    for h, v in zip(headers, row): #combine header names with row values (v) in a series of tuples
        column[h].append(v) #append each value to the relevant column

我知道我的数据现在是字典格式,我想根据“Total_Depth”键对其进行过滤,但我不确定如何执行此操作。我的目标是使用“if”语句来选择相关行,但不确定如何使用字典结构来执行此操作。

任何建议将不胜感激。某人:)

4

3 回答 3

11

使用列表理解。

import csv

with open("filepath", 'rb') as f:
    reader = csv.DictReader(f)
    rows = [row for row in reader if row['Total_Depth'] != '0']

for row in rows:
    print row

听写器

于 2013-06-21T15:16:07.210 回答
2

如果您存储 zip 的完整结果,您可以在分配之前检查相应的标头:

...
for row in reader: #for each row in the reader object
    r = zip(headers, row):
    if r['Total_Depth'] == 0:
        for h, v in r:
            column[h].append(v)
于 2013-06-21T15:14:23.200 回答
1

您正在使用的列表字典使行操作变得非常困难,因为您必须弄乱C并行列表。namedtuples是一种更方便的方式来收集和操作表格数据。

其他答案满足您遇到的确切问题。使用更友好的数据结构将有助于解决您明天遇到的问题。

于 2013-06-21T15:16:37.793 回答