2014-06-09 13 views
6

Đây là lần đầu tiên sử dụng stackoverflow để đặt câu hỏi. Tôi có tiếng Anh nghèo nàn, vì vậy nếu tôi vô tình nói bạn bằng lời, xin đừng bận tâm.Làm cách nào để dịch định dạng json này thành định dạng đúng có thể được sử dụng gấu trúc read_json()

Tôi có một tệp json (access.json), định dạng như:

[ 
{u'IP': u'aaaa1', u'Domain': u'bbbb1', u'Time': u'cccc1', ..... }, 
{u'IP': u'aaaa2', u'Domain': u'bbbb2', u'Time': u'cccc2', ..... }, 
{u'IP': u'aaaa3', u'Domain': u'bbbb3', u'Time': u'cccc3', ..... }, 
{u'IP': u'aaaa4', u'Domain': u'bbbb4', u'Time': u'cccc4', ..... }, 
{ ....... }, 
{ ....... } 
] 

Khi tôi sử dụng:

ipython 
import pasdas as pd 
data = pd.read_json('./access.json') 

nó trở lại:

ValueError: Expected object or value 

đó là kết quả tôi muốn:

[out] 
     IP Domain  Time ... 
0 aaaa1  bbbb1 cccc1 ... 
1 aaaa2  bbbb2 cccc2 ... 
2 aaaa3  bbbb3 cccc3 ... 
3 aaaa4  bbbb4 cccc4 ... 
...and so on 

Tôi nên làm gì để đạt được mục tiêu này? Cảm ơn bạn đã trả lời!

+0

Đây không phải là tệp json hợp lệ (các chuỗi phải được đặt trong dấu ngoặc kép "thay vì đơn được thêm vào trước với au). Bạn có tạo tệp" json "này không? –

+0

ĐẾN @Andy Hayden, Có, tôi tạo tệp này qua ai đó Ví dụ (bây giờ tôi biết nó là sai.) Bạn có thể dạy tôi làm thế nào định dạng có thể được sử dụng gấu trúc read_json()? Tôi đã thử [{"IP": "aaaa", "Tên miền": "bbb" ....}, {...} ...] –

Trả lời

5

Đây không phải là json hợp lệ đó là lý do tại sao read_json sẽ không phân tích cú pháp.

{u'IP': u'aaaa1', u'Domain': u'bbbb1', u'Time': u'cccc1', ..... }, 

nên

{"IP": "aaaa1", "Domain": "bbbb1", "Time": "cccc1", ..... }, 

Bạn thể đập này (toàn bộ file) với một biểu thức chính quy để tìm chúng, ví dụ:

In [11]: line 
Out[11]: "{u'IP': u'aaaa1', u'Domain': u'bbbb1', u'Time': u'cccc1'}," 

In [12]: re.sub("(?<=[\{ ,])u'|'(?=[:,\}])", '"', line) 
Out[12]: '{"IP": "aaaa1", "Domain": "bbbb1", "Time": "cccc1"},' 

Lưu ý: điều này sẽ bị xáo trộn bởi một số dây, vì vậy hãy thận trọng khi sử dụng.

Một tốt hơn "giải pháp" sẽ là để đảm bảo bạn có json hợp lệ ở nơi đầu tiên ... Có vẻ như điều này đã đến từ str/unicode/repr python của hơn json.dumps.

Lưu ý: json.dumps sản xuất json hợp lệ, do đó có thể đọc bằng read_json.

In [21]: repr({u'IP': u'aaa'}) 
Out[21]: "{u'IP': u'aaa'}" 

In [22]: json.dumps({u'IP': u'aaa'}) 
Out[22]: '{"IP": "aaa"}' 

Nếu ai đó tạo "json" này, sau đó khiếu nại! Nó không phải là json.

4

Đây không phải là định dạng JSON. Đó là danh sách các từ điển. Bạn có thể sử dụng ast.literal_eval() để có được danh sách thực tế từ các tập tin và vượt qua nó để DataFrame constructor:

from ast import literal_eval 
import pandas as pd 

with open('./access.log2.json') as f: 
    data = literal_eval(f.read()) 

df = pd.DataFrame(data) 
print df 

Output cho dữ liệu ví dụ bạn đã cung cấp:

Domain  IP Time 
0 bbbb1 aaaa1 cccc1 
1 bbbb2 aaaa2 cccc2 
2 bbbb3 aaaa3 cccc3 
3 bbbb4 aaaa4 cccc4 
+0

cảm ơn bạn đã trả lời! Tôi thử cách này, nó trả lại cho tôi thông báo 'bị giết'. –

+0

Nếu tôi có nhiều dữ liệu, có cách nào khác để hoàn thành công việc này không? –

0

Bạn cũng có thể sử dụng

pd.read_json("{json_file_name}", orient='records') 

giả định rằng các dữ liệu JSON là ở định dạng danh sách như thể hiện trong câu hỏi.

Các vấn đề liên quan