2012-11-29 13 views
7

Jestem stosunkowo nowy w Pythonie i zastanawiam się, jak najlepiej importować dane z wielu plików do jednej tablicy. Mam sporo pliki tekstowe zawierające 50 wierszy z dwóch kolumn danych (kolumna ograniczonych), takich jak:Pythonowy sposób importowania danych z wielu plików do tablicy

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 

Powiedzmy mam 10 plików tekstowych do importowania i importować do zmienna o nazwie dane.

Chciałbym utworzyć pojedynczą tablicę 3D zawierającą wszystkie dane. W ten sposób mogę łatwo narysować i zmanipulować dane, odnosząc się do danych przez data[:,:,n], gdzie n odnosi się do indeksu pliku tekstowego.

Myślę, że sposób, w jaki zrobiłbym to, to mieć tablicę kształtu (50, 2, 10), ale nie wiem, jak najlepiej użyć Pythona, aby go utworzyć. Myślałem o użyciu pętli do importowania każdego pliku tekstowego jako tablicy 2D, a następnie układania ich w stos w celu utworzenia tablicy 2D, chociaż nie można znaleźć odpowiednich poleceń do tego celu (spojrzałam na vstack i column_stack w numpy, ale te nie wydaje się, aby dodać dodatkowy wymiar).

Dotychczas pisałem kod import:

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) 

ale problem z tym kodem, jest to, że mogę jedynie przetwarzania danych, kiedy to w pętli for.

Tym, czego naprawdę chcę, jest tablica wszystkich danych importowanych z plików tekstowych.

Każda pomoc będzie bardzo ceniona dzięki!

Odpowiedz

6

"Ale problemem z tym kodem jest to, że mogę przetwarzać dane tylko wtedy, gdy są w pętli for."

Zakładając, że kod działa:

# 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

Dzięki temu poprawia się odpowiedź Cronosa. – IanRoberts

1

Szukasz tablicy, która jest [txt kolumna1, txt kolumna2, nazwa pliku]?

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

Alternatywa, jeśli nie chcesz dokonać transpozycji dwa razy.

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

JEŚLI wszystkie dane mają ten sam kształt, a następnie po prostu dołącz do listy.

all_data = [] 

i w pętli:

all_data.append(data) 

wreszcie masz

asarray(all_data) 

który jest tablicą kształtu (10,50,2) (transpozycji jeśli chcesz). Jeśli kształty nie pasują, to nie działa, numpy nie obsługuje wierszy o różnych kształtach. Następnie możesz potrzebować kolejnej pętli, która tworzy tablice o największym kształcie i kopiować dane.

+0

Dzięki, to jest proste i działa Cóż, próbowałem czegoś takiego, ale przegapiłem polecenie "asarray". Nie zdawałem sobie sprawy, że bez niego nie byłaby to tablica. – IanRoberts

1

surowy, ale szybkie

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) 


jeśli chcesz uzyskać listę plików z określonego katalogu, przyjrzeć os.walk

Ponieważ nie jest jasne, w jaki sposób chcesz dane, pokazałem wiele sposobów na ich przechowywanie

allData jest lista słowników

uzyskać 2nd kolumnę danych z 3rd pliku byłbyś w stanie zrobić allData[2]['col2']

jeśli chciał nazwę trzeciego pliku alldata[2]['name']

0

może można zrobić tak:

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] 
Powiązane problemy