繁体   English   中英

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

[英]Python - Extract specific lines from tab delimited file based on a value in a column

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

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

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

因此,根据上面的示例,新文件将仅包含以下几行:

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

使用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)

我建议您使用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 ,也可以通过一次读取一行,在'\\ t'上拆分一行来检查列表中的正确项目,然后只写那些符合条件的行来解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM