2016-12-03 1 views
0

이것은 파이썬에서 거의 기본 옵션이어야하는 가장 기본적인 작업 인 것처럼 보입니다.파일에서 파이썬 데이터 형식을 읽는 방법

123, [12, 23, 45, 67] 

두 번째 배열 길이가 가변적 인 텍스트 파일이 있습니다. 어떻게 읽습니까? 어떤 이유로 든 '['또는 ']'를 다루는 방법에 대한 문서 하나를 찾을 수 없으며, 파이썬에서 가장 기본적인 문자가 하나 다.

np.loadtxt 분명히이

np.genfromtxt 인해 누락 된 컬럼에, 가슴에만 파일 형식의 가장 간단한입니다, 가슴이었다. BTW 하나 missing_value 기능을 여기에 도움이 될 수 있다고 생각하고 싶습니다. missing_value가 실제로 무엇을하는지 알아내는 것이 유용 할 것입니다 (문서에 명확히 설명되어 있지 않음).

나는 아마도 내가 '['와 ']'하지만 난 그냥 만든이 단계에서 내 자신 다루는 항목에서이 항목을 분석 할 수있는 나에게

['123', '[12', '23', '45', '67]'] 

을 제공하는 np.fromstring 경로를 시도 python 파일 판독기를 사용하여 상당히 기본적인 파이썬 구조를 읽을 수 있습니다!

원하는 출력은이 단계에서 거의 모든 것을 해결할 것입니다. 명백한 구조 양식

[123, [12, 23, 45, 67]] 
+2

는 * "나는 하나의 파이썬에서 가장 기본 문자 주장 할 수있는 '['또는 ']'에 대처하는 방법에 대한 문서의 한 조각을 찾을 수 없습니다."* 그 때문에 수 있습니다 그 형식으로 텍스트 파일에 포함시키는 것은 드문 경우입니다. 일반적인 CSV (쉼표로 구분 된 값, 대괄호 없음)입니다. 다른 데이터 유형에 대한 다른 구분 기호가있는 극단은 [JSON] (http://www.json.org/) 및 그 친척입니다. 파일 형식의 디자인을 제어 할 수 있다면 일반 CSV (대괄호없이)로 단순화하거나 전체 JSON으로 이동하는 것이 좋습니다. –

답변

2

loadtxt과의 선으로 줄 것 genfromtxt 간단한 split로 시작하는 라인을 구문 분석합니다.

In [360]: '123, [12, 23, 45, 67]'.split(',') 
Out[360]: ['123', ' [12', ' 23', ' 45', ' 67]'] 

그들은 개별 문자열을 변환하려고합니다. 일부는 int 또는 float로 쉽게 변환됩니다. [] 인 것은 그렇지 않습니다. 그것들을 다루는 것은 사소하지 않습니다.

파이썬과 함께 제공되는 csv 독자는 인용 된 텍스트를 처리 할 수 ​​있습니다.

`one, "twenty, three", four' 

나는 따옴표 여부로 []을 처리 할 수 ​​있는지 여부를 알고 충분히 연주하지 않았습니다.

귀하의 괄호 문자는 괄호 안에 다른 구분 기호를 사용하는 경우 구문 분석하는 것이 더 쉽습니다, 예를 들어

In [371]: l1='123; [12, 23, 45, 67]'.split(';') 
In [372]: l1 
Out[372]: ['123', ' [12, 23, 45, 67]'] 
In [373]: l2=l1[1].strip().strip(']').strip('[').split(',') 
In [374]: l2 
Out[374]: ['12', ' 23', ' 45', ' 67'] 

워렌은 주석으로, 일반 CSV는 업계 표준의 무언가, 많은 언어에 사용됩니다. 대괄호 등의 사용은 표준화되지 않았습니다. 그러나 XML, JSON 및 yaml과 같은 데이터 교환 언어는 물론 텍스트가 아닌 데이터 파일 (예 : HD5F)이 있습니다.

JSON 예 :

In [377]: json.loads('[123, [12, 23, 45, 67]]') 
Out[377]: [123, [12, 23, 45, 67]] 
1

기본 옵션은 eval입니다. 문자열에서 파이썬 표현식을 평가할 수 있습니다. 보안 위험이 있습니다. this question. 그러나 ast.literal_eval은 괜찮습니다.예를 들어 :

from ast import literal_eval 

with open("name of file") as fh: 
    data = [literal_eval(line) for line in fh] 
관련 문제