Я пытаюсь найти слово в файле и искать его в двух разных файлах. - найти это слово в первом файле, и если слово найдено, строка печатается в новом файле - искать то же слово во втором файле и, если найдено слово, напечатать строку, найденную во втором файле в том же выходном файле, после строки, найденной в первом файле и отделенной табуляцией .

Это сценарий, который я написал:

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

Спасибо

0
Mondher 14 Дек 2015 в 23:28

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
3
cricket_007 14 Дек 2015 в 21:09

Я бы предложил использовать 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
0
albert 14 Дек 2015 в 21:18

Один из способов сделать это - поместить первые два файла в словари. Затем мы можем просмотреть поисковый документ и посмотреть, является ли запись ключом в нашем первом словаре. Если это так, мы извлекаем значение (исходную строку) и ищем его во второй. Если оно также находится во втором, мы добавляем значение к нашему тексту и затем записываем его в файл.

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
Adam 14 Дек 2015 в 21:09