0

グロブを使用してディレクトリ内の多数のファイルを読み取るスクリプトがあり、特定の json フィールドの各行で見つかった日付に基づいて、それらを行ごとに新しいファイルに分割します。

ある程度機能するスクリプトは次のとおりです。

import json
import glob
import fileinput
from dateutil import parser
import ast
import gzip

line = []

filestobeanalyzed = glob.glob('../data/*')

for fileName in filestobeanalyzed:
        inputfilename = fileName
        print inputfilename
        for line in fileinput.input([inputfilename]):
                line = line.strip();
                if not line: continue
                line = ast.literal_eval(line)
                line = json.dumps(line)
                if not json.loads(line).get('created_at'): continue
                date = json.loads(line).get('created_at')
                date_converted = parser.parse(date).strftime('%Y%m%d')
                outputfilename = gzip.open(date_converted, "a")
                outputfilename.write(line)
                outputfilename.write("\n")

outputfilename.close()

ディレクトリ内の最初のファイルの終わりに到達すると、次のエラーが発生します。

python split_json_docs_by_date_with_dict-to-json.py 
../data/research_data_p1.json
Traceback (most recent call last):
  File "split_json_docs_by_date_with_dict-to-json.py", line 18, in <module>                                                                                  
    line = ast.literal_eval(line)                                                                                                                            
  File "/usr/lib64/python2.7/ast.py", line 49, in literal_eval                                                                                               
    node_or_string = parse(node_or_string, mode='eval')                                                                                                      
  File "/usr/lib64/python2.7/ast.py", line 37, in parse                                                                                                      
    return compile(source, filename, mode, PyCF_ONLY_AST)                                                                                                    
  File "<unknown>", line 1                                                                                                                                   
    {u'user': {u'follow_request_sent': None, u'profile_use_background_image': False, u'default_profile_image': False, u'geo_enabled': False, u'verified': False, u'profile_image_url_https': u'https://si0.twimg.com/profile_images/1829421396/yA6hEz2j_normal', u'profile_sidebar_fill_color': u'DDEEF6', u'id': 15054232, u'profile_text_color': u'333333', u'followers_count': 117, u'protected': False, u'id_str': u'15054232', u'profile_background_color': u'858585', u'listed_count': 6, u'utc_offset': -25200, u'statuses_count': 9418, u'description': u"Hi- I'm Jordan, and I refuse to put any effort into this bio. Well... except just enough to type this I guess.", u'friends_count': 59, u'location': u'Washington Terrace, UT', u'profile_link_color': u'0084B4', u'profile_image_url': u'http://a3.twimg.com/profile_images/1829421396/yA6hEz2j_normal', u'notifications': N    

ast が行の評価に失敗しているのは明らかですが、次のように挿入すると、行は完全ではありません。

if not ast.literal_eval(line): continue

の前に:

line = ast.literal_eval(line) 

私はまだまったく同じエラーが発生します。

4

1 に答える 1

2

単純にエラーを無視する場合は、try ブロックで例外をキャッチして続行できます。複数行の JSON を解析する場合、fileinput は最適な選択ではない可能性があります。

これがあなたのために働くはずの編集です。これには、基本的な複数行の JSON サポートと try ブロックの両方が含まれているため、解析不能要素によってプログラムがクラッシュすることはありません。テストデータにアクセスできないため、これはテストされていません。基本的な複数行の JSON サポートを削除するには、コメントのある行を削除するだけです。

import json
import glob
import fileinput
from dateutil import parser
import ast
import gzip

line = []

filestobeanalyzed = glob.glob('../data/*')

for fileName in filestobeanalyzed:
        inputfilename = fileName
        print inputfilename
        pastlines = "" # stores previous unparsable lines
        for line in fileinput.input([inputfilename]):
                line = pastlines + line # put past unparsable lines with current line
                line = line.strip();
                if not line: continue
                try:
                    line = ast.literal_eval(line)
                    line = json.dumps(line)
                    pastlines = "" # reset unparsable lines
                except:
                    pastlines += line # add current line to unparsable lines
                    continue
                date = json.loads(line).get('created_at', None)
                if not date: continue
                date_converted = parser.parse(date).strftime('%Y%m%d')
                outputfilename = gzip.open(date_converted, "a")
                outputfilename.write(line)
                outputfilename.write("\n")

outputfilename.close()
于 2012-06-05T01:04:48.643 に答える