отредактируйте текстовый файл с помощью Python

Используйте Систему пространства имен. Сеть. Почта. Вот ссылка на страницу

MSDN, можно отправить почтовому использованию класс SmtpClient.

я перефразировал пример кода, таким образом, контроль детали MSDNfor.

MailMessage message = new MailMessage(
   "fromemail@contoso.com",
   "toemail@contoso.com",
   "Subject goes here",
   "Body goes here");

SmtpClient client = new SmtpClient(server);
client.Send(message);

лучший способ послать много электронных писем состоял бы в том, чтобы поместить что-то вроде этого в forloop и отослать!

6
задан mr.zog 17 October 2009 в 17:35
поделиться

5 ответов

Заменить LASTKNOWN на CURRENT в /etc/ipf.conf

Заменить все сразу

filename = "/etc/ipf.conf"
text = open(filename).read()
open(filename, "w").write(text.replace(LASTKNOWN, CURRENT))

Заменить строку строкой

from __future__ import with_statement
from contextlib import nested

in_filename, outfilename = "/etc/ipf.conf", "/tmp/ipf.conf"
with nested(open(in_filename), open(outfilename, "w")) as in_, out:
     for line in in_:
         out.write(line.replace(LASTKNOWN, CURRENT))
os.rename(outfilename, in_filename)

Примечание: "/tmp/ipf.conf" следует заменить на tempfile.NamedTemporaryFile () или аналогичный
Примечание: код не тестировался.

6
ответ дан 8 December 2019 в 02:22
поделиться

Возможно, самым простым способом было бы открыть файл с помощью f = open (имя файла, режим). Затем прочитайте все строки с помощью f.readlines () (это вернет список строк, представляющих строки программы).

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

В конце вы можете записать строки обратно в файл с помощью f.writelines (lines), который удобно возвращает список строк.

ПРИМЕЧАНИЕ: Это неэффективный способ сделать это, он просто самый простой. Пожалуйста,

Пример кода:

f = open(filename, "r")
lines = f.readlines()

# Assume that change_ip is a function that takes a string and returns a new one with the ip changed): example below
ret_lines = [change_ip(lines) for line in lines]
new_file = open(new_filename, "w")
new_file.writelines(lines)

def change_ip(str):
   ''' Gets a string, returns a new string where the ip is changed '''
   # Add implementation, something like: return str.replace(old_ip, new_ip) or something similair.
1
ответ дан 8 December 2019 в 02:22
поделиться

После проверки комментариев и фрагмента кода, который вы поместили в pastebin, вот рабочее решение. Для начала файл /tmp/iiiipf.conf содержит:

Simply a test file 175.48.204.168

And two times 175.48.204.168 on this line 175.48.204.168

Done.

После запуска кода файл /tmp/iiiipf.conf содержит:

Simply a test file 10.73.144.112

And two times 10.73.144.112 on this line 10.73.144.112

Done.

А вот проверенный рабочий код с моими материалами, слитый с вашим кодом pastebin. :

import socket
import fileinput
import subprocess
import string
import re

CURRENT = socket.getaddrinfo(socket.gethostname(), None)[0][4][0]
LASTKNOWN = '175.48.204.168'

if CURRENT == LASTKNOWN:
    print 'Nevermind.'
    subprocess.sys.exit()

else:

    cf = open("/tmp/iiiipf.conf", "r")
    lns = cf.readlines()
    # close it so that we can open for writing later
    cf.close()

    # assumes LASTKNOWN and CURRENT are strings with dotted notation IP addresses
    lns = "".join(lns)
    lns = re.sub(LASTKNOWN, CURRENT, lns)  # This replaces all occurences of LASTKNOWN with CURRENT

    cf = open("/tmp/iiiipf.conf", "w")
    cf.write(lns)
    cf.close()

Этот фрагмент кода будет делать то, что вам нужно, даже если IP-адрес используется несколько раз в файле конфигурации. Он также изменит его в строках комментариев.

Этот метод не требует копирования в / tmp и использует на один вызов подпроцесса меньше при перезапуске брандмауэра и NAT.

0
ответ дан 8 December 2019 в 02:22
поделиться

Вы пытаетесь «атомарно» обновить содержимое файла, и на эту тему было много восхитительных войн пламени. Но общая картина такова:

1) Запишите новый файл во временный файл и убедитесь, что вы его очистили и закрыли.

2) Используйте возможности вашей операционной системы, чтобы атомарно переименовать временный файл в старый файл.

Теперь вы просто не может атомарно переименовать файл в Windows, но похоже, что вы в любом случае используете unix-подобную систему. Вы атомарно переименовываете, используя os.rename () .

2
ответ дан 8 December 2019 в 02:22
поделиться

Другой способ простого редактирования файлов на месте - это используйте модуль fileinput :

import fileinput, sys
for line in fileinput.input(["test.txt"], inplace=True):
    line = line.replace("car", "truck")
    # sys.stdout is redirected to the file
    sys.stdout.write(line)
27
ответ дан 8 December 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: