2012-11-29 4 views
7

필자는 Python을 처음 사용하고 여러 파일의 데이터를 단일 배열로 가져 오는 것이 가장 좋은 방법인지 궁금합니다.여러 파일에서 배열로 데이터를 가져 오는 Python 방법

Length=20.txt 
1, 50.7 
2, 90.9 
3, 10.3 
#etc 
END OF FILE 

의 내가이로 가져 오기 10 개 텍스트 파일이 있다고 가정 해 봅시다 -

Length=10.txt:  
1, 10  
2, 30  
3, 50 
#etc 
END OF FILE 

가 : I는 다음과 같은 데이터 (열 분리)의 두 열 50 개 행을 포함하는 꽤 많은 텍스트 파일이 변수 데이터.

모든 데이터가 포함 된 단일 3D 배열을 만들고 싶습니다. 이렇게하면 데이터를 data[:,:,n]으로 참조하여 데이터를 쉽게 플롯하고 조작 할 수 있습니다. 여기서 n은 텍스트 파일의 인덱스를 나타냅니다.

제가 생각하기에이 방법은 모양 배열 (50, 2, 10)을 갖는 것이지만, 파이썬을 사용하여 만드는 방법을 잘 모르는 것 같습니다. 루프를 사용하여 각 텍스트 파일을 2D 배열로 가져온 다음 2D 배열을 만들기 위해 쌓아 올리려고했지만 적절한 명령을 찾을 수는 없었습니다. (나는 numpy에서 vstack과 column_stack을 보았지만 여분의 차원을 추가하지 않는 것).

는 지금까지 내가 가져 오기 코드를 작성했습니다 :

file_list = glob.glob(source_dir + '/*.TXT') #Get folder path containing text files 

    for file_path in file_list: 
     data = np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18) 

그러나이 코드의 문제를하다 내가 할 수있는 유일한 프로세스가 for 루프에서의 데이터입니다.

정말 원하는 것은 텍스트 파일에서 가져온 모든 데이터의 배열입니다.

도움을 주시면 감사하겠습니다.

답변

6

"그러나이 코드의 문제점은 for 루프에있을 때만 데이터를 처리 할 수 ​​있다는 것입니다."

가정 코드가 작동합니다

# Get folder path containing text files 
file_list = glob.glob(source_dir + '/*.TXT') 
data = [] 
for file_path in file_list: 
    data.append(
     np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)) 
# now you can access it outside the "for loop..." 
for d in data: 
    print d 
+0

감사합니다. 이것은 크로노스의 대답을 향상시킵니다. – IanRoberts

1

[txt column1, txt column2, filename] 인 배열을 찾으십니까?

file_list = glob.glob(source_dir + '/*.TXT') #Get folder path containing text files 


for num,file_path in enumerate(file_list): 
    data = np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18) 
    data = np.vstack((data.T,np.ones(data.shape[0])*num)).T 
    if num==0: Output=data 
    else: Output=np.vstack((Output,data)) 

두 번 바꾸기를 원하지 않는다면 다른 방법이 있습니다.

data = np.vstack((data,(np.ones(data.shape[0])*num).reshape(-1,1))) 
1

모든 데이터가 동일한 모양으로되어있는 경우 목록에 추가하면됩니다.

all_data = [] 

하고 루프

:

all_data.append(data) 

마침내 당신은 모양 (10,50,2)의 배열을 (당신이 원하는 경우 트랜스)입니다

asarray(all_data) 

있습니다. 도형이 일치하지 않으면 작동하지 않지만 numpy는 다른 도형의 행을 처리 할 수 ​​없습니다. 그런 다음 가장 큰 모양의 배열을 만들고 데이터를 복사하는 다른 루프가 필요할 수 있습니다.

+0

감사합니다,이 간단하고 작품입니다 글쎄 - 나는 이런 식으로 시도했지만 'asarray'명령을 놓쳤다. 그것 없이는 배열이되지 않을 것이라는 것을 나는 깨닫지 못했다. – IanRoberts

1

원유하지만 빠른을

listFiles=["1.txt","2.txt", ... ,"xxx.txt"] 
allData=[] 
for file in listFiles: 
    lines = open(file,'r').readlines() 

    filedata = {} 
    filedata['name'] = file 
    filedata['rawLines'] = lines 
    col1Vals = [] 
    col2Vals = [] 
    mapValues = {} 

    for line in lines:   
     values = line.split(',') 
     col1Vals.append(values[0]) 
     col2Vals.append(values[1]) 
     mapValues[values[0]] = values[1] 
    filedata['col1'] = col1Vals 
    filedata['col2'] = col2Vals 
    filedata['map'] = mapValues 
    allData.append(filedata) 


당신이 특정 디렉토리에서 파일의 목록을 os.walk

를보고 싶을 경우

데이터를 원하는 방식이 명확하지 않기 때문에 여러 가지 방법으로 저장하고 있습니다.

allData
는 사전의 목록입니다

세 번째 파일의 이름을 원하는 경우 allData[2]['col2']

을 할 수있을 것 3 파일에서 데이터의 두 번째 열을 얻을 수 alldata[2]['name']

0

어쩌면 당신은 다음과 같이 수행 할 수 있습니다

file_list = glob.glob(source_dir + '/*.TXT') # Get folder path containing text files 
data = [np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18) 
     for file_path in file_list] 
관련 문제