Python в первую очередь скриптовый язык. Такие языки часто используются для создания консольных утилит.
Напишите простую утилиту, которая очищает заданный файл от:
- повторяющихся пробелов;
- повторяющихся символов перевода строки;
- табуляций,
- излишних пробелов в начале и конце строк.
Формат ввода
Пользователь вводит два имени файлов.
Входной файл содержит неформатированный текст произвольной длины.
Формат вывода
Во второй файл выведите очищенный текст.
Пример
Ввод
# Пользовательский ввод:
first.txt
second.txt
# Содержимое файла first.txt
очень плохо форматированный текст
ну ну
прямо
очень-очень
Вывод
# Содержимое файла second.txt
очень плохо форматированный текст
нуну
прямо
очень-очень
Решение
Основная проблема в этой задаче – наличие повторяющихся пробелов. Справиться с ними можно разными способами. Можно удалять сдвоенные пробелы в строке, пока они там остаются. Можно воспользоваться умением метода split() удалять любое количество пробелов при вызове без параметров. Но нужно помнить, что split() без параметров разбивает строку по знакам табуляции и перевода строки. А это значит, что при выборе этого способа придется позаботиться о сохранности переводов строк. При любом способе решения табуляциями стоит заняться в первую очередь, потому что два пробела, разделенные табуляцией превратятся в двойной пробел.
Посмотреть код
Решение
file_in, file_out = input(), input()
data = []
with open(file_in, "r") as file:
for string in file:
data.append(string.strip().replace("\t", "").split())
data = [item for item in data if any(item)]
with open(file_out, "w") as file:
for string in data:
print(" ".join(string), file=file)
Решение
file_in = input()
file_out = input()
with open(file_in, encoding="UTF-8") as file_in:
text = file_in.read()
while text.find("\t") + 1:
text = text.replace("\t", "")
while text.find(" ") + 1:
text = text.replace(" ", " ")
text = "\n".join(string.strip() for string in text.split("\n") if string)
with open(file_out, "w", encoding="UTF-8") as file_out:
file_out.write(text)
На мой взгляд, авторы хендбука некорректно составили тестовые данные, вот например вторая строка из примера “ну ну” превратилась в “нуну”, почему не в “ну ну”? это логичнее, ведь между явными цельными словами пробелоподобных разрывов нигде нет, а вот “нуну” они решили разбить двумя табами и считать что такое должно писаться слитно, логики не нашёл) да и собственный код из-за этого проверки не проходил, жаль обидно досадно