Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 25, 2017 11:55:14

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Добрый день.
Подскажите пожалуйста как в текстовом файле сделать замену по шаблону, с сохранением строк и последующей записью.

Например. Нужно заменить во всем файле “age” на “years” и “fname” на “surname”

 pname 1; fname 1; age 1
pname 2; fname 2; age 2
pname 3; fname 3; age 3



Офлайн

#2 Авг. 25, 2017 12:10:00

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2728
Репутация: +  183  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Метод replace



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Авг. 25, 2017 12:24:43

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Почему выдает ошибку?

File “C:\Python 3.6\lib\re.py”, line 191, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
 def parsing():
    rpl = [['Нормальный ', ''],
           ['Дверь', ''],
           ['Дата: ', ''],
           [' Область: ', '']]
    f_in = open('in.csv', 'r')
    f_out = open('out.txt', 'w', encoding='utf-8')
    for string in rpl:
        input_file = re.sub(str(string[0]),str(string[1]),f_in)  
    f_out.write(input_file)
    f_in.close()
    f_out.close()



Отредактировано Ubhra (Авг. 25, 2017 12:57:48)

Офлайн

#4 Авг. 25, 2017 13:12:05

krok64
Зарегистрирован: 2017-04-04
Сообщения: 75
Репутация: +  11  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Ubhra
Почему выдает ошибку?
в re.sub третий параметр должен быть строкой или набором байт. а у тебя это объект файла.

Офлайн

#5 Авг. 25, 2017 13:43:41

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

open('in.csv', ‘r’)
должен ведь возвращать содержимое файла одной строкой

П.С. Аааа точно его же прочесть нужно:

 input_file = re.sub(str(string[0]),str(string[1]),f_in.read())

Вот только он создает пустой файл.



Отредактировано Ubhra (Авг. 25, 2017 13:46:35)

Офлайн

#6 Авг. 25, 2017 14:05:51

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Вот так частично заработало, но изменяет только первую запись:

 def parsing():
    rpl = [['Нормальный ', ''],['Дверь', ''],['Дата: ', ''],[' Область: ', '']]
    f_in = open('in.csv', 'r')
    f_out = open('out.txt', 'w', encoding='utf-8')
    for string in rpl:
        f_out.write(re.sub(str(string[0]),str(string[1]),f_in.read()))
    f_in.close()
    f_out.close()
    print('ok')



Офлайн

#7 Авг. 25, 2017 14:29:02

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Питон зверюга всеядная. У меня так заработало :D :

 def parsing():
    f_in = open('in.csv', 'r')
    f_out = open('out.txt', 'w', encoding='utf-8')
    nf1 = re.sub(str('Нормальный вход по ключу'),str('вход'),f_in.read())
    nf2 = re.sub(str('Нормальный выход по ключу'),str('выход'),nf1)
    nf3 = re.sub(str('Дверь'),str(''),nf2)
    nf4 = re.sub(str('Дата: '),str(''),nf3)
    nf5 = re.sub(str(' Область: '),str(''),nf4)
    nf6 = re.sub(str('"'),str(''),nf5)
    f_out.write(nf6)
    f_in.close()
    f_out.close()
    print('ok')



Офлайн

#8 Авг. 27, 2017 11:16:50

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Для множественного поиска/замены существуют специальные алгоритмы и использующие их библиотеки.
https://pypi.python.org/pypi/flashtext

Офлайн

#9 Апрель 25, 2020 21:17:13

PyBeg
Зарегистрирован: 2020-04-25
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

Добрый день!
Не подскажете, почему выдаёт ту же самую “зловредную” ошибку “TypeError: expected string or bytes-like object”?

import re, urllib.request
class HTMLFinder:
def findTag(website, tag):
url = urllib.request.urlopen(website)
tags = url.read()
tagsF = ‘'’'''
for line in tags:
if re.search(tag, line):
tagsF = tagsF + line + ‘/n’
if len(tagsF) < 3: return False
else: return tagsF

Ну я в принципе-то всё правильно написал, пробелы есть, а пишет всё то же(((

Отредактировано PyBeg (Апрель 25, 2020 21:19:47)

Офлайн

#10 Апрель 26, 2020 04:21:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

Множественные замены в текстовом файле

PyBeg
Не подскажете, почему выдаёт ту же самую “зловредную” ошибку “TypeError: expected string or bytes-like object”?
Потому что принятые данные в байтах надо раскодировать через метод .decode() в юникод-строку. Для раскодирования надо использовать кодировку, которая передаётся вместе с данными. Можно и наугад раскодировать, использовав распространённую кодировку utf-8. Для одного случая подойдёт. Для общего же случая (когда сайт произвольный) надо узнавать кодировку, прежде чем раскодировать, и для этого нужно дополнительный код писать.



Отредактировано py.user.next (Апрель 26, 2020 04:22:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version