[英]Converting a Perl module to JSON with Python
我有一個Perl( .pm
)文件,我一直試圖進入JSON表示,以便我可以在其中搜索關鍵字。
我腳本的目錄是/Devices/bin/script.py
。 .pm
文件所在的目錄在一個級別,所以/Devices/Devices.PM
。 Devices.PM
只是一個靜態文件,包含結構化為字典和列表的數據,如下所示:
mylist = (
blah => {
other =9,
houses => 1,
etc => [
{ etc => '5',
ppl => '3,
things => "etc",
animals => [ 'blah-228', 'blah-229' ]
},
{ etc => '9',
ppl => '5',
things => "22",
animals => [ 'blah-2', 'blah-5' ]
},
],
partner => 'ets',
location => 'wherever',
},
blah => {
ppl => 6,
place => 101,
things => 'etc',
animals => 'whatever',
},
我有:
os.chdir("..")
with open('Devices.pm', 'r') as f:
json_obj = json.dumps(f)
print json_obj
但我一直得到TypeError: <open file 'SwitchConfig.pm', mode 'w' at 0x10c1f69c0> is not JSON serializable
。 我已經嘗試了幾種沒有運氣的方法,包括json.dump(s)
。 我不斷得到不同的錯誤。 我是否正確理解我的.pm
文件結構才能將其轉換為JSON表示形式?
您似乎需要使用Perl腳本(或單行)讀取此內容,因此導出適當的JSON。
首先,顯示的內容不是Perl。 我會假設發布一些基本語法錯誤的拼寫錯誤。
在mylist
面前也有一個缺失%
; 在Perl變量名稱中以sigil開頭, %
表示哈希值。 我會假設這是在發布中的遺漏,但它是存在的。 如果沒有,你必須解決這個問題。
然后讓我使用文件data.pm
等
%mylist = ( blah => { other => 9, houses => 1, etc => [ { etc => '5', ppl => '3' }, { etc => '9', ppl => '5' } ] } );
這是一個簡短的發布數據樣本,並修復了一些拼寫錯誤。
這是一個用它來制作JSON的Perl腳本。 它使用do來執行文件作為腳本,從而將數據結構(哈希)讀入程序。 然后JSON :: PP模塊用於生成JSON
,因為它應該安裝在具有Perl的系統上。
use warnings;
use strict;
use JSON::PP;
my %data = do './data.pm';
my $data_json = encode_json \%data;
print $data_json, "\n"; # just to see it
my $outfile = 'data.json';
open my $fh, '>', $outfile or die "Can't open $outfile: $!";
print $fh $data_json, "\n";
close $fh;
整個工作在前兩行完成。 JSON::PP
是一個核心模塊( 自v5.14起 ),但如果外部依賴不是問題,請使用JSON ,如果安裝了JSON ,則使用快速JSON::XS
。
這非常適合單線
perl -MJSON::PP -wE'say encode_json { do "./data.pm" }' > data.json
將輸出重定向到文件的位置。
程序和單線輸出(為了便於閱讀而打破線路)
{"blah":{"other":"9","houses":"1","etc": [{"ppl":"3","etc":"5"},{"ppl":"5","etc":"9"}]}}
寫入的文件data.json
的內容是什么。
為此, .pm
文件必須只包含有效的Perl數據結構。 如果有多個變量而不是那個哈希,那么這將不起作用,因為do
不會返回所有數據。 然后你必須通過其他方式處理文件。
json.dumps
從Python對象(如{"foo": True}
)轉換為表示該對象為JSON的字符串(如'{"foo": true}'
)。 您似乎試圖以另一種方式將包含JSON的文件轉換為Python對象; 執行此操作的函數是json.load
。 但是,由於Devices.pm
不包含JSON,因此仍然無法正常工作。 您需要編寫一個導入Devices.pm
的Perl腳本,然后將其內容轉儲為實際的JSON,或者在Python中為Perl編寫解析器。 我推薦第一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.