Доброго времени суток! Подскажите, пожалуйста, как перезаписать текст из файла в новый, где новый текст будет содержать позицию (нумерацию) из алфавита. Например, для текстового файла с содержанием "ABC" нужно записать новый файл с контентом "123"(где А=1, В=2 - порядковый номер в английском алфавите). Заранее благодарю.
-
1@VladSpirin Это и есть он, только на русском языке. – Tivyram Mar 13 '18 at 11:45
-
Ознакомьтесь: Тур, далее Как задать хороший вопрос? и Как создать минимальный, самодостаточный и воспроизводимый пример? – Mar 13 '18 at 11:50
-
связанный вопрос Как заменить строчку в .txt файле через python 3? – jfs Mar 13 '18 at 12:41
2 Answers
Алгоритм:
from string import ascii_uppercase
text = 'HelloWorld'
for c in text.upper():
pos = ascii_uppercase.index(c) + 1
positions.append(pos)
print(positions) # [8, 5, 12, 12, 15, 23, 15, 18, 12, 4]
Реализация (с удалением не латинских букв):
from string import ascii_uppercase
import re
Открытие файла для считывания из него
with open('input.txt') as f:
text = f.read()
# Удаление из строки всех символов, не входящих в диапазон латинских букв
text = re.sub(r'[^a-zA-Z]+', '', text)
Запись результата в файл
with open('out.txt', 'w') as f:
for c in text.upper():
pos = ascii_uppercase.index(c) + 1
f.write(str(pos))
Реализация (с сохранением не латинских букв):
from string import ascii_uppercase
Открытие файла для считывания из него
with open('input.txt', encoding='utf-8') as f:
text = f.read()
Запись результата в файл
with open('out.txt', 'w', encoding='utf-8') as f:
for i in text:
c = i.upper()
if c in ascii_uppercase:
pos = ascii_uppercase.index(c) + 1
f.write(str(pos))
else:
f.write(i)
@jfs предложил интересный способ замены латинских букв их порядком через регулярку (с сохранением исходного текста):
import re
Открытие файла для считывания из него
with open('input.txt') as f:
text = f.read()
# Замена латинских букв на их порядок в алфавите
text = re.sub(r'[A-Za-z]', lambda m: str(ord(m.group().upper())-ord('A') + 1), text)
# Запись результата в файл
with open('out.txt', 'w') as out:
out.write(text)
- 77,085
-
-
1
-
1Спасибо огромное за столь быструю реакцию. Повторила ваш алгоритм, но у меня возникает ошибка: pos = string.ascii_uppercase.index(c) + 1 ValueError: substring not found – u_lialia Mar 13 '18 at 12:27
-
в файле могут быть не только английские буквы.
re.sub(r'[A-Za-z]', lambda m: str(ord(m.group().upper())-ord('A') + 1), text)– jfs Mar 13 '18 at 12:45 -
jfs, конечно могут быть не только английские буквы, но и пунктуация, пробелы и т.п. ,но в вопросе об этом не слова, поэтому не стал усложнять алгоритм. @u_lialia, достаточно будет перед обработкой исключить все не английские буквы? – gil9red Mar 13 '18 at 12:54
-
@jfs, а почему бы просто не так сделать:
re.sub(r'[^a-zA-Z]+', '', 'aBc123 ?,АВГд')? – gil9red Mar 13 '18 at 12:55 -
1-
ValueErrorс вами не согласно о том какой ввод должен быть 2- ваш re.sub пытается что-то удалить (не вижу никакого отношения к задаче). Выражение, которое я привёл берёт text строку и заменяет все английские буквы на порядковый номер в алфавите. (то что в вопросе спрашивается) – jfs Mar 13 '18 at 13:03 -
понятно, спасибо за объяснение, 1) интересно, как у вас
ValueErrorвышел... 2) интересное применение регулярки :) – gil9red Mar 13 '18 at 13:06 -
1Ребят, все работает, огромное спасибо! Я новичок в Python, пыталась реализовать данную задачу около трех дней, и сегодня решила зарегаться на данном сайте. Я шокирована тем, насколько быстро пришел ответ. ЗдОрово! – u_lialia Mar 13 '18 at 14:27
-
@u_lialia, и помните: "Чтобы поблагодарить автора ответа, проголосуйте за ответ или отметьте его как решение" :D – gil9red Mar 13 '18 at 14:48
import string
dt = {ord(s): str(string.ascii_lowercase.index(s.lower()) + 1) for s in string.ascii_letters}
with open('in.txt') as f1, open('out.txt', 'w') as f2:
f2.write(str.translate(f1.read(), dt))
- 8,897