2017-05-27 16 views
0

私はPythonの初心者です。私はUNIXのstdoutファイルを取り込んでJSON形式のファイルに変換するスクリプトを作成しようとしています。ファイルの形式は、すべての行に以下の通りです:今、私の問題は、私は分割を使用する場合(あるPythonでカスタムLinuxのstdoutをJSONに貼り付けるにはどうすればいいですか?

236342512 200 George usr/temp/a\ path/random1.txt 

inodeNumber fileSize ownerName pathToFile 

パスは、例を空白やバックスラッシュ文字を含めることができています"")メソッドを使用して辞書に格納すると、ファイルパスの空白はパスのキー値を2つ以上作成します。私はそれをエンコードすることを考えましたが、そのスペースがエンコードされるので、パス内のスペースの問題は解決しません。

私が取得しようとしていますJSON形式は次のとおりです。また、キーにそれぞれの属性を格納するためにJSONにそのカスタムUNIXの標準出力ファイルから、このような変換に進めるための最善の解決策である

{ 
    "files": [{ 
     "inodeNumber": "236342512", 
     "fileSize": "200", 
     "ownerName": "George", 
     "pathToFile": "usr/temp/a\ path/random1.txt" 
    }, 
    {...}] 
} 

Python辞書で-valueペアを作成し、JSONオブジェクトを作成してファイルにダンプしますか?私は非常に大きなファイル(それぞれ1GB以上!)で作業するので、パフォーマンスも考慮する必要があります。

ありがとうございます!

私はそれがパスについては何も想定していないとして、行を解析するために、このメソッドを使用すると思い
+0

あなたが知っているので、最初の3つの値には空白がなく、残りの値(パス)には、最初の3つの値をとり、値として代入し、残りの分割結果を取り出して結合してみましょうスペースで一緒に戻って?あなたのユースケースを背景にしなくても、パフォーマンスについて何かお勧めするのは誰にとっても難しいでしょう。 – imm

+2

出力jsonはどのように見えますか? 'str.split(" "、4)'は分割問題を修正します。 – jordanm

+0

@imm返信いただきありがとうございます。希望のJSON出力を含むように投稿を編集しました。だから、配列に最初の3つの値を取得したら、他の値と一緒にパスに戻っていく方法は?また、どの情報を背景としてさらに提供する必要がありますか?申し訳ありませんが、スタックオーバーフローに関する質問を投稿したのは初めてのことですが、残念ですが、私はまだそれほど残っていません。Pこれが役に立ったら、1000万行以上を処理しようとしています。 –

答えて

0

:ご例えば

s = r'236342512 200 George usr/temp/a\ path/random1.txt' 

def parseLine(s): 
    sList = s.split(' ') 
    D = {} 
    D['inodeNumber'] = sList[0] 
    D['fileSize'] = sList[1] 
    D['ownerName'] = sList[2] 
    D['pathToFile'] = ' '.join(sList[3:]) 
    return D 

print(parseLine(s)) 

を、それはこの出力を与える:

{'inodeNumber': '236342512', 'fileSize': '200', 'ownerName': 'George', 'pathToFile': 'usr/temp/a\\ path/random1.txt'} 
関連する問題