2012-11-29 34 views
7

Tôi tương đối mới đối với Python và tự hỏi cách tốt nhất để nhập dữ liệu từ nhiều tệp vào một mảng đơn lẻ. Tôi có khá một vài tập tin văn bản có chứa 50 hàng của hai cột dữ liệu (cột phân cách) như:Cách Pythonic để nhập dữ liệu từ nhiều tệp vào một mảng

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

-

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

Hãy nói rằng tôi có 10 tập tin văn bản để nhập khẩu và nhập khẩu vào một biến được gọi là dữ liệu.

Tôi muốn tạo một mảng 3D chứa tất cả dữ liệu. Bằng cách đó, tôi có thể dễ dàng vẽ và thao tác dữ liệu bằng cách tham chiếu đến dữ liệu theo số data[:,:,n] trong đó n là chỉ mục của tệp văn bản.

Tôi nghĩ rằng cách tôi làm điều này là có một mảng hình dạng (50, 2, 10), nhưng không biết cách tốt nhất để sử dụng python để tạo ra nó. Tôi đã nghĩ về việc sử dụng một vòng lặp để nhập mỗi tệp văn bản thành một mảng 2D, và sau đó xếp chúng để tạo một mảng 2D, mặc dù không thể tìm thấy các lệnh thích hợp để thực hiện điều này (tôi đã xem vstack và column_stack ở dạng gumpy nhưng dường như không thêm thứ nguyên bổ sung).

Cho đến nay, tôi đã viết mã nhập khẩu:

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) 

Nhưng vấn đề với mã này, là tôi chỉ có thể xử lý dữ liệu khi nó trong vòng lặp for.

Điều tôi thực sự muốn là một mảng của tất cả dữ liệu được nhập từ tệp văn bản.

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao!

Trả lời

6

"Nhưng vấn đề với mã này, là tôi chỉ có thể xử lý dữ liệu khi nó ở trong vòng lặp for."

Giả sử mã của bạn hoạt động:

# 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

Cảm ơn, điều này cải thiện khi câu trả lời của cronos. – IanRoberts

1

Bạn đang tìm kiếm một mảng là [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)) 

Thay thế nếu bạn không muốn chuyển hai lần.

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

NẾU tất cả dữ liệu có cùng hình dạng thì chỉ cần thêm vào danh sách.

all_data = [] 

và trong vòng lặp của bạn:

all_data.append(data) 

cuối cùng bạn có

asarray(all_data) 

đó là một loạt các hình dạng (10,50,2) (transpose nếu bạn muốn). Nếu các hình dạng không khớp nhau, thì điều này không hoạt động, mặc dù không thể xử lý các hàng có các hình dạng khác nhau. Sau đó, bạn có thể cần một vòng lặp khác tạo ra các mảng có hình dạng lớn nhất và sao chép dữ liệu của bạn.

+0

Cảm ơn, đây là đơn giản và công trình tốt - Tôi đã thử một cái gì đó như thế này nhưng bỏ lỡ lệnh 'asarray'. Tôi đã không nhận ra nó sẽ không phải là một mảng mà không có nó. – IanRoberts

1

thô nhưng nhanh chóng

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) 


nếu bạn muốn có được một danh sách các tập tin từ một thư mục cụ thể, hãy nhìn vào os.walk

Vì không rõ bạn muốn dữ liệu như thế nào, tôi đã hiển thị nhiều cách để lưu trữ dữ liệu

allData là một danh sách các từ điển

để có được cột thứ 2 của dữ liệu từ file thứ 3 bạn sẽ có thể làm allData[2]['col2']

nếu bạn muốn tên của tập tin thứ ba alldata[2]['name']

0

có lẽ bạn có thể làm như thế này:

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] 
Các vấn đề liên quan