Найти - Пользователи
Полная версия: Множественные замены в текстовом файле
Начало » Python для новичков » Множественные замены в текстовом файле
1 2
Ubhra
Добрый день.
Подскажите пожалуйста как в текстовом файле сделать замену по шаблону, с сохранением строк и последующей записью.

Например. Нужно заменить во всем файле “age” на “years” и “fname” на “surname”
 pname 1; fname 1; age 1
pname 2; fname 2; age 2
pname 3; fname 3; age 3
Rodegast
Метод replace
Ubhra
Почему выдает ошибку?
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()
krok64
Ubhra
Почему выдает ошибку?
в re.sub третий параметр должен быть строкой или набором байт. а у тебя это объект файла.
Ubhra
open('in.csv', ‘r’)
должен ведь возвращать содержимое файла одной строкой

П.С. Аааа точно его же прочесть нужно:
 input_file = re.sub(str(string[0]),str(string[1]),f_in.read())

Вот только он создает пустой файл.
Ubhra
Вот так частично заработало, но изменяет только первую запись:
 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')
Ubhra
Питон зверюга всеядная. У меня так заработало :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')
Shaman
Для множественного поиска/замены существуют специальные алгоритмы и использующие их библиотеки.
https://pypi.python.org/pypi/flashtext
PyBeg
Добрый день!
Не подскажете, почему выдаёт ту же самую “зловредную” ошибку “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

Ну я в принципе-то всё правильно написал, пробелы есть, а пишет всё то же(((
py.user.next
PyBeg
Не подскажете, почему выдаёт ту же самую “зловредную” ошибку “TypeError: expected string or bytes-like object”?
Потому что принятые данные в байтах надо раскодировать через метод .decode() в юникод-строку. Для раскодирования надо использовать кодировку, которая передаётся вместе с данными. Можно и наугад раскодировать, использовав распространённую кодировку utf-8. Для одного случая подойдёт. Для общего же случая (когда сайт произвольный) надо узнавать кодировку, прежде чем раскодировать, и для этого нужно дополнительный код писать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB