Как отсортировать числа из двух разных текстовых файлов, а затем сохранить их как один текстовый файл - PullRequest
1 голос
/ 19 января 2020

Может кто-нибудь помочь, пожалуйста. У меня есть следующая задача:

  • Создать в этой папке новый файл Python с именем комбинированный.py
  • Создать текстовый файл с именем numbers1.txt, содержащий Целые числа, которые сортируются от наименьшего к наибольшему.

  • Создайте еще один текстовый файл с именем numbers2.txt, который также содержит целые числа, отсортированные от наименьшего к наибольшему.

  • Запишите числа из обоих файлов в третий файл с именем all_numbers.txt

  • Все числа в all_numbers.txt должны быть отсортированы от наименьшего к наибольшему.

2 текстовых файла:

numbers1:

20
10
30
50
40
60

затем:

numbers2:

999
80
150
101
100

Следующий код ниже берет два файла txt и сохраняет их как один файл правильно. У меня просто возникают проблемы с сортировкой целых чисел по возрастанию. Любая помощь будет оценена! Спасибо!

filenames = ['numbers1.txt', 'numbers2.txt']
with open('all_numbers.txt', 'w') as outfile:
    for a in filenames:
        with open(a) as infile:
            outfile.write(infile.read() + "\n")
print("Your file is saved under all_numbers.txt")

Ответы [ 2 ]

2 голосов
/ 19 января 2020

В настоящее время вы записываете содержимое каждого входного файла на выход, как только прочитаете их (outfile.write(infile.read() + "\n")). Чтобы обработать их, я бы предложил вам сначала прочитать их в списки, а затем работать с ними.

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

Затем вам нужно объединить эти два списка и отсортировать их. Есть много алгоритмов для этого. Поскольку ваша задача не указана, вы можете просто использовать встроенную функцию sorted() или метод списка .sort(). Это должно было бы работать со списком, состоящим из двух списков, соединенных вместе. Чтобы объединить два списка в Python, мы можем просто добавить их ([1, 2] + [3, 4] == [1, 2, 3, 4]).

Следовательно, ваше окончательное решение может выглядеть примерно так:

filenames = ['numbers1.txt', 'numbers2.txt']
num_lists = [[int(x) for x in open(f).read().strip().split('\n')] \
             for f in filenames]
with open('all_numbers.txt', 'w') as outfile:
    outfile.write('\n'.join(str(x) for x in sorted(sum(num_lists, []))) + '\n')

print('Your file is saved under all_numbers.txt')

Обратите внимание, что sum(numbers_list, []) эквивалентно numbers_list[0] + numbers_list[1], но лучше, поскольку ваше решение теперь будет работать с любым количеством входных файлов. :)

Тест

$ echo '20
> 10
> 30
> 50
> 40
> 60' > numbers1.txt
$ echo '999
> 80
> 150
> 101
> 100' > numbers2.txt
$ python -q
>>> filenames = ['numbers1.txt', 'numbers2.txt']
>>> num_lists = [[int(x) for x in open(f).read().strip().split('\n')] \
...              for f in filenames]
>>> with open('all_numbers.txt', 'w') as outfile:
...     outfile.write('\n'.join(str(x) for x in sorted(sum(num_lists, []))) + '\n')
... 
37
>>> print('Your file is saved under all_numbers.txt')
Your file is saved under all_numbers.txt
>>> 
$ cat all_numbers.txt 
10
20
30
40
50
60
80
100
101
150
999
2 голосов
/ 19 января 2020

Звучит так, как будто простое слияние было бы лучше, мы будем использовать sorted, чтобы пока все было просто.

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

def load_numbers(filepath):
    with open(filepath, 'r') as file:
        return [int(n) for n in file.readlines()]

Теперь мы можем вызвать ее, чтобы загрузить наши числа в список:

first_numbers = load_numbers('numbers1.txt')
second_numbers = load_numbers('numbers2.txt')

Теперь нам нужен способ объединить эти два списка и убедиться, что они отсортированы. Используя Python sorted, мы можем сделать:

sorted_numbers = sorted(first_numbers + second_numbers)

Ответ Джо имеет отличный способ расширить это на несколько списков, используя sum.

Чтобы записать это в файл мы можем сделать нечто похожее на то, что мы сделали с чтением:

with open('all_numbers.txt', 'w') as file:
    file.writelines(sorted_numbers)

Всего:

def load_numbers(filepath):
    with open(filepath, 'r') as file:
        return [int(n) for n in file.readlines()]


if __name__ = '__main__':
    first_numbers = load_numbers('numbers1.txt')
    second_numbers = load_numbers('numbers2.txt')

    sorted_numbers = sorted(first_numbers + second_numbers)

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