Поиск строк из файла во втором файле в python - PullRequest
0 голосов
/ 03 августа 2020

Я делаю первые шаги в python, и у меня есть одна проблема. Я хочу открыть два файла: один размером 4 КБ, а второй - 11 МБ. Первый (меньший) файл выглядит так:

ABCDE
FGDTR
DTRDG
DRTYJ
ARTYF

, а второй больше похож:

 33.492513889    9.217400000  ABCDE YYYY XX 2118994
 16.000000000  -30.000000000  CJSIA YYYY XX 2115145
 17.000000000  -30.000000000  OALXM YYYY XX 2115145
 18.000000000  -30.000000000  DRTYJ YYYY XX 2115145

Как вы можете видеть, первые значения - это координаты, первые - широты, вторые - долготы . Я хочу найти строки из первого файла во втором файле и создать файл со всеми результатами (с именем ex done.txt) в этом формате:

XXXXX;LATITUDE;LONGITUDE;

Где XXXXX - это строка из первого файла.

Спасибо за любые советы

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

При небольшом форматировании функциональность может быть легко достигнута с помощью Pandas.

Второй файл должен быть правильно отформатирован как CSV. Я взял ваш ввод и отформатировал его, как показано ниже, с некоторыми полями заголовка, как показано ниже:

Latitute    Longitude   Indicator   someColumn1 someColumn2 someInteger
33.492513889    9.217400000 ABCDE   YYYY    XX  2118994
16.000000000    -30.000000000   CJSIA   YYYY    XX  2115145
17.000000000    -30.000000000   OALXM   YYYY    XX  2115145
18.000000000    -30.000000000   DRTYJ   YYYY    XX  2115145

ПРИМЕЧАНИЕ: я использую \ t-> tab в качестве разделителя

Сама программа очень проста :

import pandas as pd

toSearch= []
with open('firstFile.txt', 'r') as fd:
    toSearch= fd.read().split('\n')

df = pd.read_csv('secondFile.txt', delimiter='\t')

df[df['Indicator'].isin(inputs)][['Indicator', 'Latitute', 'Longitude']].to_csv('output.txt', index=False)

Если вы не хотите использовать pandas, мы все же можем добиться этого, просматривая строку за строкой и ища строку.

toSearch= []
with open('firstFile.txt', 'r') as fd:
    toSearch= fd.read().split('\n')
with open('secondFile.txt', 'r') as fd, open('output.txt', 'w') as fout:
    while fd:
        line = fd.readline()
        if not line:
            break
        line_words =  line.split('\t')
        if line_words[2] in toSearch:
                   fout.write({}\t{}\t{}\n".format(line_words[2],line_words[0],line_words[1]))

        
0 голосов
/ 03 августа 2020

Вы также можете попробовать это

открыть свой первый и второй файл с помощью open("file_name.extantion",'mode'), а затем прочитать данные

first_obj = open('first.txt','r')
second_obj = open('second.txt','r')

first_obj.close()
second_obj.close()

f_file = first_obj.read().split('\n')
s_file = second_obj.read().split('\n')

, затем вы можете проверить, соответствует ли каждая строка f_file с в строке s_file

for string in f_file:
    for line in s_file:
        if string in line:
            lat_long = ' '.join(line.split()[0:2])
            final = open('done.txt','a+')
            final.write(string+' '+lat_long+'\n')
            final.close()

Не забудьте безопасно закрыть файлы после операции, или вы также можете использовать оператор with

0 голосов
/ 03 августа 2020

Файловый объект в python по сути является генератором. Вы можете открыть его и перебирать по строкам, используя for l oop.

with open('file.txt', 'r') as f:
    for line in f:
        print(line)

Для вашей проблемы мой подход состоял бы в том, чтобы хранить все слова из первый файл в set. (для более быстрых операций с членством)

Откройте второй файл и прочтите из него каждую строку. Разделите строку и извлеките strings из строки и проверьте, находится ли он в set. Если это так, то эта строка есть в первом файле, и вы можете записать ее в требуемом формате в выходной файл.

Я не хочу писать код за вас, и вы должны сделать это сами. Но это был бы мой подход.

В качестве примечания, вы можете открывать несколько файлов, используя with.

with open('file1.txt', 'r') as file1, open('done.txt', 'w') as output:
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...