2011-08-18 38 views
0

匹配的文件我有兩個文件如下使用python程序

File1 
ids 
CID5265 
CID7263 
CID9289 
.... 

File 2 
ids 
CID7363 3.5e-06 -3837 
CID5265 4.5  -938 
CID9289 8.9  -9873 
.... 

我想比較文件1與文件2匹配file1中任何IDS存在於文件2,如果是的,我應該打印全線如下

CIDS9289 8.9 -9873 
.... 

以達致這寫python腳本如下

infile = open("file1","r") 

searchtxt = open("file2.txt","r") 

for line in infile.readlines(): 

    if searchtxt in line: 

     print line 

,但我給出以下錯誤

Traceback (most recent call last): 
    File "finding_words.py", line 7, in <module> 
    if searchtxt in line: 
TypeError: 'in <string>' requires string as left operand, not file 

我知道即時通訊做很簡單的錯誤,但無法弄清楚任何人可以告訴你怎麼解決這個..提前

感謝

NI

+5

請記住,單擊最好的旁邊的複選標記以接受您的問題的答案。到目前爲止,你還沒有爲你的任何問題做過這件事。你應該爲這個問題做,並且你也應該回答這個問題。 – agf

+0

如果你在Unix系統上,你應該檢查'join'。 –

回答

2

使用以下命令:

print [line for id in searchTxtData for line in inFileData if id.strip() in line] 

或使用聲明:

因爲 searchtxt是一個文件對象,而不是字符串
ids = [id.strip() for id in open("file1.txt","r") if id.strip()] 

with open("file2.txt","r") as dataFile: 
    for line in dataFile:    
     if line.strip() and line.split()[0] in ids: 
      print line 
+0

效率不高,但應該有效。一個更好的選擇:對數據進行排序並僅使用一個循環,迭代兩個文件。 –

+0

是的 - 你的權利 –

+0

嗨,我試着使用與statment當我執行程序什麼都沒有打印,甚至沒有顯示任何錯誤 – nit

2
# Usage: foo.py ID_FILE DATA_FILE 

ids = set() 
with open(sys.argv[1]) as id_file: 
    ids = set(line.strip() for line in id_file) 

with open(sys.argv[2]) as data_file: 
    for line in data_file: 
     if line.split()[0] in ids: 
      print line, 
+0

這個。因爲你應該思考套。如果你對'with'不熟悉(他們什麼時候引入了它?我從來沒有得到它的訣竅......),你可以做'id_file = open(sys.argv [1])'並且不要嘗試忘記關閉它之後。實際上,如果你對'with'不滿意,你應該坐下來增加你的技能......所以,呃,再見,我要閱讀教程:) –

1

你的計劃失敗。據推測,您想要在該文件對象上添加另一個循環,檢查中line中的文本。

0

問題是你有你的搜索倒退 - 而不是看看你的第一個文件中的行是否在第二個,你問是否整個第二個文件在第一個文件的行中。您需要遍歷第二個文件,檢查每行開頭的密鑰是否在第一個文件數據中。更改您的代碼,如下所示:

infile = open("file1","r") 

keys = set() 
for line in infile: 
    break # skip first line 
for line in infile: 
    keys.add(line.strip()) # get rid of trailing newline 

searchtxt = open("file2.txt","r") 

for line in searchtxt: 
    break # skip first line 
for line in searchtxt: 
    key, rest = line.split(' ', 1) 
    if key in keys: 
     print line