2015-12-14 51 views
0

我試着去找到一個詞,是一個文件,然後搜索這個詞在兩​​個不同的文件 - 要搜索的第一個文件,如果這個詞是單詞的那個線打印在一個新文件 中 - 在第二個文件中搜索相同的單詞,並且如果發現該單詞在第一個文件中找到的行後面的同一個輸出文件中打印出第二個文件中找到的行,表格編號爲查找兩個文件蟒相同的模式

這是我寫的劇本:

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 

謝謝

+1

請提供輸入文件的樣本片段... – albert

+0

請那些增加的問題作爲編輯。你想找哪個詞組?整條線或只是一個具體的表達? – albert

+0

我的猜測是:'second_file'是'file'對象,即一個迭代器,並且在第一個文件的第一個單詞之後,該迭代器耗盡,所以不能找到其他單詞。 –

回答

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) 

的的output.txt

contig-39000000 1211 11.3902 out.13 

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

內容file1.txt

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

目錄目錄解決這個

+0

相較於獨特的[我的回答(http://stackoverflow.com/a/34276645/3991125)這裏所提供的解決方案產生更好的輸出,因爲'合併()'提供正是我們所希望。沒有空的'NaN'細胞... – albert

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) 
+0

我試着用上面的代碼字典,但我得到的結果是: IndexError:列表索引超出範圍 我猜是因爲入口元素太大 – Mondher

+0

這可能是由於第二個文件中的一行沒有空格。你知道這是否會發生? – Adam

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 

文件1。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 
+0

只是幾乎毆打你的答案;) –

+0

相同的想法,但略有不同的做法。很高興看到其他人有非常類似的想法。偉大的互相學習。 – albert

+0

我想你忘了OP想要的輸出是製表符分隔的。 –