2016-06-22 7 views
-2

こんにちは私のpythonコードは、変数ファイル(perl形式で書かれた)を読み、Pythonスクリプトで使用する変数を認識する必要があります。私は、ファイル上で読み込み、変数を認識するために私のpythonコードを希望pythonはどのようにperl形式で書かれた変数を読むことができますか?

$x=1.2; 
$y=90.2; 
$z=4.2334; 
$img1='version1.png'; 
$img2='version2.png'; 

:私の変数ファイル(variable.txt)は以下のように書かれています。私は

fp=open("variables.txt","r") 
var=fp.read() 
fp.close 
print(var) 

コード上記のファイルがvariable.txtファイルからすべての行を読み込みますが、Pythonコードを変数としてそれらを認識しませんでした読み取るためのコードの下に使用します。私は

e.g. A=x+y 

私はA = 91.4を取得したいと思いますが、エラーが

「名前を示し 'X' に定義されていません

また、これらの変数を使用するときに私は何を意味しています私は

img1=Image.open("%s" %'img1') to open version1.png. 

で画像を開こうとしたとき、それは仕事と

を示しませんでした

そのようなファイルまたはディレクトリ:だから「IMG1」

、誰もがperlの形式の変数は、Pythonスクリプトによって読み取られるように、私が命じるものとどのように提案することができますか? Tks

+2

プログラミングは魔法ではありません。あなたはperlファイルを解析していません。代わりにperlを使用してください。 – YOU

+0

@YOU、私はしたいと思いますが、Perlを使用すると、コード全体が複雑になるため、コード全体がPythonで書かれています。私はちょうど私のpythonスクリプトからその変数ファイルを読む必要があります。 – Teddy

+1

あなたはPerlプログラム( 'variables.txt')を持っていて、Perlを使って実行したくないと言っています。それは起こらないだろう。より厳密にファイルのフォーマットを定義する必要があります。それまでは、この質問に答えることはできません。 – ikegami

答えて

3

このような変数ファイルを解析し、その代わりに定義されたデータ転送形式を使用したいと強くお勧めします。

ソースデータを見ると、JSONが適しています。これを簡単に行うためには、そのようなハッシュとして名前空間に挿入:与え

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Data::Dumper; 
use JSON; 

my %export = (x => 1.2, 
       y => 90.2, 
       z => 4.2334, 
       img => [ 'version1.png', 'version2.png' ]); 

print Dumper \%export; 

open (my $transfer, '>', 'transfer.json') or die $!; 
print {$transfer} to_json (\%export, {pretty => 1}); 
close ($transfer); 

- あなたのファイルにを:いかなる言語で自明読めるべきである

{ 
    "z" : 4.2334, 
    "x" : 1.2, 
    "img" : [ 
     "version1.png", 
     "version2.png" 
    ], 
    "y" : 90.2 
} 

。 (Pythonを含む)。

0

variables.txtファイルをPerlコードとして扱い、その中で宣言されているすべての変数をJSONオブジェクトにラップして印刷する、次のPerlプログラムを実行するためにPythonからシェルすることもできます。

perl -MJSON -e ' 
package Foo; 
do "variable.txt"; 
package main; 
my $export; 
foreach my $key (keys %{Foo::}) { 
    next if $key eq "BEGIN"; 
    $export->{$key} = ${"Foo::$key"}; 
} 
print JSON::encode_json($export);' 

だから、基本的には、サブプロセスとしてこれを実行したり、Pythonでそれを開き、出力をキャプチャして、Pythonのデータ構造にそれをJSON-デコードします。

JSON出力は次のようになります。

{ 
    'x': 1.2, 
    'y': 90.2, 
    'z': 4.2334, 
    'img1': 'version1.png', 
    'img2': 'version2.png' 
} 

これは、変数定義ファイルが含まれており、(PHPのrequireなど)Perlコードのようにそれを治療するための別のpackagedoを使用して動作します。パッケージは、基本的に名前空間の定義です。次に、メインパッケージ(これはPerlプログラムのデフォルトです)に戻り、他の名前空間のシンボルテーブルを読み込みます。これには、読み込んで定義したばかりの変数がすべて含まれています。

myで宣言されていないため、それらはレキシカルではなくパッケージ変数として扱われます。 use strictがないので、プログラムはそれについて文句を言っていません。

シンボルテーブルに他のものが含まれている可能性があります。私がこれを試したとき(doなし)、ブロック定義はBEGINでした。私は怠け者だったので、私はちょうどそれを明示的に解析しました。あなたはシンボルテーブル内のそれらのものの参照型を見始めることができますが、それは努力する価値がないと思います。 Fooパッケージには、他に何かがあるべきではありません。

次に、それらをキーとしてハッシュリファレンスに割り当ててから、それをJSONに変換して出力します。


私は一般as Sobrique suggestsにJSONにデータ交換フォーマットを変更すると行くには良い方法であると信じています。

関連する問題