Перенос данных между php и python
Php имеет свой аналог pickle для того, чтобы сохранять объекты в файл. Выглядит примерно так a:1:{s:5:"Hello";s:5:"World";}. Прочитать эти данные в python можно с помощью модуля PHPSerialize.
…обо всём понемногу
Архив рубрики ‘python’
Php имеет свой аналог pickle для того, чтобы сохранять объекты в файл. Выглядит примерно так a:1:{s:5:"Hello";s:5:"World";}. Прочитать эти данные в python можно с помощью модуля PHPSerialize.
Решил довести таки предыдущюю запись до логического конца. Итак, на следующей “итерации” мы переносим разбиение строк на столбцы к операции считывания данных и записываем в более питонистом стиле (то есть без lambda)
# считываем и разбиваем на столбцы
data = [x.split() for x in open(input_file, 'r').readlines()]
# конвертируем
data = [x+" %4.2f\n"%((float(y)-32)/1.8) for (x,y) in data]
# записываем результат
open(output_file, 'w').writelines(data)
PS: ну а самый правильный инструмент для подобных задач, конечно же, awk
cat input.dat | awk '{print $1 " " ($2-32)/1.8}' > output.dat
в свое время, знакомство с haskell отставило неизгладимый след в моем подходе к написанию программ :). Вот здесь обсуждают небольшой конвертер, который я переписал бы так
#!/usr/bin/env python
import sys, math
try:
input_file = sys.argv[1]; output_file = sys.argv[2]
except:
print "Usage:",sys.argv[0], "infile outfile"
sys.exit(1)
ifile = open(input_file, 'r')
data = ifile.readlines()
ifile.close()
def convert_f_to_c(y):
zz=(y-32)/1.8
return zz
data = map(lambda (a,b):
"%g %4.2f\n" % (float(a), convert_f_to_c(float(b))),
map(lambda x: x.split(), data))
ofile = open(output_file, 'w')
ofile.writelines(data)
ofile.close()
Впрочем, этот код можно ещё упростить. Во-первых, совсем необязательно конвертировать первый столбец “строка” → “вещ. число” → “строка”, во-вторых, отдельную функцию convert_f_to_c перевода из Фарангейтов в Цельсии заменим на лямбду и получится
#!/usr/bin/env python
import sys, math
try:
input_file = sys.argv[1]; output_file = sys.argv[2]
except:
print "Usage:",sys.argv[0], "infile outfile"
sys.exit(1)
ifile = open(input_file, 'r')
data = ifile.readlines()
ifile.close()
data = map(lambda (a,b):
"%s %4.2f\n" % (a, (lambda f: (f-32)/1.8)(float(b))),
map(lambda x: x.split(), data))
ofile = open(output_file, 'w')
ofile.writelines(data)
ofile.close()
разбирался сегодня с такой проблемой: скрипт на python-е, в нем строка вида ‘/_\_’ (входные данные вот такие, юзвери прикалываются :) ) и надо ее передать дальше в базу данных на PostgreSQL конструкцией вида, например,
UPDATE XXX SET xID = '/_\_' ...
Чтение документации показало, то БД хочет данные в виде ‘\’ → ‘\\’, то есть обратный слэш надо заэкранировать + указать на это явным образом используя префикс E, т.е. получаем sql-команду вида
UPDATE XXX SET xID = E'/_\\_' ...
теперь переходим к python-у — заэкранировать слеши в строке можно так
x = '/_\_'
y = x.encode('string_escape')
получим требуемый результат
y = '/_\\_'