2016-12-29 1 views
0

나는 이것이 이상한 요청이라고 생각합니다. 문자열로 시작한 다음 문자열 (여러 줄)을 처리하고 목록을 반환하는 함수를 통해이를 실행합니다. 이 목록에는 타임 스탬프와 텍스트가 들어 있습니다. 그것은 실제로 LRC 파일입니다 (트랙 시간과 함께 가사)문자열을 목록으로 변환하고 뒤로

나는 소수의 kodi (xmbc) 모듈을 쓰고 있으며 자체 파이썬 인터프리터를 실행합니다. addons간에 데이터를 공유 할 수 있지만 문자열로만 사용할 수 있습니다. (kodi에서 속성으로 설정)

그래서 나는 str()을 사용하여 쉽게 문자열로 변환 할 수있는 목록을 가지고 있지만 처리 할 수있는 동일한 목록으로 되돌릴 수는 없습니다.

몇 가지 예를 들어 텍스트 :

[01:45.17]<i>I cant remember anything 
[01:48.80]Cant tell if this is true or dream 
[01:52.29]Deep down inside I feel to scream 
[01:55.91]This terrible silence stops me 

이 목록으로 내 파서 함수에서 돌아옵니다. 원시 형태로 다음과 같습니다

[{'timestamp': dbus.Int64(105170L), 'id': dbus.UInt32(0L), 'text': 'I cant remember anything'}, {'timestamp': dbus.Int64(108800L), 'id': dbus.UInt32(1L), 'text': 'Cant tell if this is true or dream'}, {'timestamp': dbus.Int64(112290L), 'id': dbus.UInt32(2L), 'text': 'Deep down inside I feel to scream'}, {'timestamp': dbus.Int64(115910L), 'id': dbus.UInt32(3L), 'text': 'This terrible silence stops me'}] 

내가 STR로 문자열이 변환되면() 정확히 문자열로 위의 무엇처럼 보인다.

이제이 문자열을 원래 목록 양식으로 되돌리고 싶습니다. 나는 그것에 라인 프로세스 라인을, 내가 미리 변환 된 목록과 함께 할 수있는대로 요소를 참조 할 수 있도록 : 나는 여러 가지를 시도했습니다

print line['text'] 
print line['timestamp'] 

, 그러나 그것을 다시 얻을 수없는 것 루프를 통해 목록을 만들 수 있습니다.

내가 json.dumps 보았다 ('라인'목록입니다) :

lines_str=str(lines) 
newlines=eval(lines_str) 
:

lines_str=json.dumps(lines) 
newlines=json.dumps(lines_str) 

print newlines.__class__.__name__ 

는 그러나이 선은 "STR" 그래서 여전히 있음을 알려줍니다, 나는 평가와 시도

Traceback (most recent call last): 
    File "./l.py", line 33, in <module> 
    newlines=eval(lines_str) 
    File "<string>", line 1, in <module> 

다음 내가시도 :

그러나 평가는 문자열 형식을 좋아하지 않는다 ast 모듈에서은 :

lines_str=str(lines) 
newlines=ast.literal_eval(lines_str) 

는 그러나 그것은 더 적은 내 캐릭터를 좋아했다.

File "/usr/lib/python2.7/ast.py", line 79, in _convert 
    raise ValueError('malformed string') 
ValueError: malformed string 

이 작업은 하나의 애드온에서 수행 할 수 있습니다. 그러나 디자인의 정신으로 나는 작업을 수행하는 백엔드와 예쁜 그림을 그리는 프론트 엔드를 가지고있다. 백 엔드에서 작업을 유지하고 프런트 엔드에서 모듈 및 프로세스로드를 최소화하는 것이 좋습니다.

+2

왜 'json.dumps'가 두 번입니까? –

+0

분명히 모든 테스트를 통해 json.loads로 변경하는 것을 잊어 버렸기 때문에 작동합니다. 어떻게에 대한. – jgauthier

+0

질문을 편집하고 처음에'lines'에 정확히 무엇을 표시하십시오. – martineau

답변

0

글쎄, 일반적으로 각 줄마다 별도로 문자열 서식을 사용하고 줄 바꿈과 함께 사용합니다. dbeh에 대해 아무 것도 모르기 때문에 함수가 dbus.Int64을 타임 스탬프 형식으로 변환한다고 가정합니다.

def from_parsed_line(line): 
    return "{timestamp}{text}".format(
     timestamp=from_dbus_int64(line["timestamp"]), 
     text=line["text"] 
    ) 

그러면 "\n".join(from_parsed_line(line) for line in lines)을 사용할 수 있습니다.

첫 번째 줄에는 <i>의 샘플이 있었지만 구문 분석 된 데이터에는 text에없는 것으로 나타났습니다. 왜 그런지 설명 할 수 없다면, 내가 그걸 다시 돌려 놓을 수는 없어. 나는 당신이 그것을 알아낼 수 있다고 가정합니다.

0

형식에 대해서는 확실치 않지만 json.dumps (데이터 구조를 이미 가지고있는 문자열로 직렬화 함)과 json.loads (정확히 반대)을 필요로합니다. 그리고 문자열을 비 직렬화 한 후에 필요한 키/값을 반복하고 가져옵니다.

0

이 함수는 원래 작성하지 않았고 작성자가 dbus.types를 사용하는 이유를 알지 못합니다. 내가 일을하지 않은 제대로

사용 json.dumps 및 json.loads :

그래서, 두 가지 솔루션이 있습니다.

또는 dbus.types를 제거하고 표준 파이썬 유형을 사용하십시오.
후자를 사용하면 str() 및 eval()을 사용하여 변환 할 수있었습니다. 모듈을로드하는 것보다 선호합니다.

감사합니다.

관련 문제