Архив рубрики ‘python’

Перенос данных между php и python

Php имеет свой аналог pickle для того, чтобы сохранять объекты в файл. Выглядит примерно так a:1:{s:5:"Hello";s:5:"World";}. Прочитать эти данные в python можно с помощью модуля PHPSerialize.

про конвертер данных II

Решил довести таки предыдущюю запись до логического конца. Итак, на следующей “итерации” мы переносим разбиение строк на столбцы к операции считывания данных и записываем в более питонистом стиле (то есть без 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 = '/_\\_'