在两个文件python中找到相同的模式

时间:2015-12-14 20:28:53

标签: python

我试图找到文件中的单词并在两个不同的文件中搜索该单词 - 在第一个文件中搜索该单词,如果找到该单词,则该行将打印在新文件中 - 在第二个文件中搜索相同的单词,如果找到该单词,则在第一个文件中找到的行后面的同一输出文件中打印第二个文件中找到的行,并用列表分隔。

这是我写的脚本:

for line in first_file:
   for line2 in second_file:
      for word in keywords:
       if re.match (r"\b"+word+r"\b" , line):
          result = (line.strip()+'\t'+line2.strip())
          print (result, file = new_file)

但我得到的结果总是一个空文件。

This is an example of the first file : 
contig-39000000 1211    11.3902
contig-44000000 6128    17.8944
contig-91000000 2180    14.2197

this is an example of the second file 
contig-316000330    out.18
contig-39000000 out.25

...

这是搜索文件的示例

contig-39000000
contig-289000379
contig-300000489
contig-310000168
contig-310000172
contig-320000463
contig-324000213
contig-327000055
contig-341000436
contig-342000384
....

预期结果如下:

contig-39000000 1211    11.3902   out.25

谢谢

3 个答案:

答案 0 :(得分:3)

是的,熊猫比SQLite容易得多。

import pandas as pd

# change sep to use '\t' if those files actually are tab-delimited 
df1 = pd.read_csv('file1.txt', sep=r'\s+', header=None)
df2 = pd.read_csv('file2.txt', sep=r'\s+', header=None)

result = pd.merge(df1, df2, on=0)
result.to_csv('output.txt', sep='\t', header=False, index=False)

file1.txt

的内容
contig-39000000 1211    11.3902
contig-44000000 6128    17.8944
contig-91000000 2180    14.2197

file2.txt

的内容
contig-39000000     out.13
contig-316000330    out.18
contig-316000341    out.25

output.txt

的内容
contig-39000000 1211    11.3902 out.13

答案 1 :(得分:0)

解决此问题的一种方法是将前两个文件放入词典中。然后我们可以遍历搜索文档,看看该条目是否是我们第一个字典中的键。如果是,我们检索值(原始行)并在第二行中搜索它。如果它也在第二个中,我们将值附加到文本中,然后将其写入文件。

first_dict = {line.split()[0]: line for line in first_file}
second_dict = {line.split()[0]: line.split()[1] for line in second_file}

for search in search_file:
    if search in first_dict:
        out_text = first_dict[search]

        if search in second_dict:
            out_text = out_text + "\t" + second_dict[search]

        new_file.write(out_text)

答案 2 :(得分:0)

我建议使用Pandas DataFrames,这对于处理更大的数据非常有用。

我的方法如下:

#!/usr/bin/env python3
# coding: utf-8

import pandas as pd

# read both input files
df1 = pd.read_csv('file1.csv', delim_whitespace=True, names=['A', 'B'], index_col=0)
df2 = pd.read_csv('file2.csv', delim_whitespace=True, names=['C'], index_col=0)

# concat the DataFrames read generated from the read data on same index
df3 = pd.concat([df1, df2], axis=1)

# print all DataFrames in order to double-check
print(df1)
print(df2)
print(df3)

# write concated DataFrame to output.csv
df3.to_csv('output.csv', header=False, sep='\t')

此代码段将使用两个输入文件并生成如下输出文件:

output.csv:

contig-316000330            out.18
contig-39000000 1211.0  11.3902 out.25
contig-44000000 6128.0  17.8944 
contig-91000000 2180.0  14.2197 

file1.csv(输入文件):

contig-39000000 1211    11.3902
contig-44000000 6128    17.8944
contig-91000000 2180    14.2197

file2.csv(输入文件):

contig-316000330    out.18
contig-39000000 out.25