Python - 根据列中的值从制表符分隔文件中提取特定行

时间:2017-03-15 04:39:30

标签: python csv

我是一个新手,所以请耐心等待,到目前为止我只使用终端通过grep和split来操作csv文件。

我有一个相当大的制表符分隔文件(500多MB),我需要根据特定列中的条件进行过滤。即我想从Header5中选择值为.error In Header4和C1的所有行,并将其写入新文件:

<<

基于上面的例子,新文件只有以下几行:

Header1    Header2   Header3  Header4  Header5  Header6
Value1     Value2    Value3   .error   C1       Value6
Value1     Value2    Value3   .Notice  C1       Value6
Value1     Value2    Value3   .error   C2       Value6
Value1     Value2    Value3   .error   C1       Value6
Value1     Value2    Value3   .Main    C2       Value6

2 个答案:

答案 0 :(得分:1)

使用csv模块。

import csv
output = []
with open('<your_csv_file_to_read>', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter='\t')
    for row in spamreader:
        if 'Header1' in row or row[3] == '.error':
            output.append(row)
with open('<your_csv_file_to_write>', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter='\t')
    for row in output:
        spamwriter.writerow(row)

修改

为了提高性能效率,我们可以同时打开这两个文件,然后我们不需要在output变量中存储已过滤的行。

import csv
output = []
with open('<your_csv_file_to_read>', 'rb') as csvfile1, open('<your_csv_file_to_write>', 'wb') as csvfile2:
    spamreader = csv.reader(csvfile1, delimiter='\t')
    spamwriter = csv.writer(csvfile2, delimiter='\t')
    for row in spamreader:
        if 'Header1' in row or row[3] == '.error':
            spamwriter.writerow(row)

答案 1 :(得分:1)

我建议您使用pandas包。 Pandas是一个非常强大的数据操作库。有了它,您只需几行代码即可完成此任务:

import pandas as pd

df = pd.read_table( INPUT_FILENAME ) #read in the file
df = df.query('Header4 == ".error"') #select the rows where Header4 == ".error"
df.to_csv( OUTPUT_FILENAME, sep='\t') #write the output to a tab-separated file

INPUT_FILENAME和OUTPUT_FILENAME是分别提供输入和输出文件路径的字符串。

如果您无法安装pandas,您也可以通过一次阅读一行来解决此问题,并将其拆分为&#39; \ t&#39;检查列表中的正确项目,然后只写入符合条件的那些行。