2012-11-29 10 views
7

मैं पाइथन के लिए अपेक्षाकृत नया हूं और सोच रहा हूं कि एकाधिक फ़ाइलों से डेटा को एकल सरणी में कैसे आयात करना है।एकाधिक फ़ाइलों से डेटा को एक सरणी में डेटा आयात करने के लिए पाइथोनिक तरीका

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 

: मैं इस तरह के रूप डेटा (स्तंभ सीमांकित) के दो स्तंभों के 50 पंक्तियों से युक्त काफी कुछ पाठ फ़ाइलें है परिवर्तनीय डेटा कहा जाता है।

मैं सभी डेटा युक्त एक एकल 3 डी सरणी बनाना चाहता हूं। इस तरह, मैं data[:,:,n] द्वारा डेटा का जिक्र करके डेटा को आसानी से साजिश और कुशलतापूर्वक उपयोग कर सकता हूं जहां n टेक्स्ट फ़ाइल की अनुक्रमणिका को संदर्भित करता है।

मुझे लगता है कि जिस तरह से मैं यह करूँगा वह आकार (50, 2, 10) है, लेकिन यह नहीं पता कि इसे बनाने के लिए पाइथन का सर्वोत्तम उपयोग कैसे किया जाए। मैंने प्रत्येक पाठ फ़ाइल को 2 डी सरणी के रूप में आयात करने के लिए एक लूप का उपयोग करने के बारे में सोचा है, और उसके बाद उन्हें 2 डी सरणी बनाने के लिए ढेर किया गया है, हालांकि ऐसा करने के लिए उचित आदेश नहीं मिल सका (मैंने vstack और column_stack को numpy में देखा लेकिन ये एक अतिरिक्त आयाम जोड़ने के लिए प्रतीत नहीं होता है)।

अब तक, मैं आयात कोड लिखा है:

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) 

लेकिन इस कोड के साथ समस्या यह है, कि मैं यह कर सकते हैं केवल प्रक्रिया डेटा जब यह पाश के लिए में है।

जो मैं वास्तव में चाहता हूं वह टेक्स्ट फ़ाइलों से आयातित सभी डेटा की एक सरणी है।

किसी भी मदद की बहुत सराहना की जाएगी धन्यवाद!

उत्तर

6

"लेकिन इस कोड के साथ समस्या यह है कि मैं केवल लूप में डेटा को संसाधित कर सकता हूं।"अपने कोड

मान लिया जाये कि काम करता है:

# 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) 

अंत में आप

asarray(all_data) 

जो आकार (10,50,2) की एक सरणी (स्थानांतरित अगर आप चाहते हैं) है। यदि आकार मेल नहीं खाते हैं, तो यह काम नहीं करता है, हालांकि 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 शब्दकोशों की एक सूची है

3 फ़ाइल से डेटा के 2 कॉलम आप अगर आप तीसरे फ़ाइल का नाम चाहता था allData[2]['col2']

ऐसा करने में सक्षम हो जाएगा प्राप्त करने के लिए 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]