Thread View: pl.comp.lang.python
11 messages
11 total messages
Started by Mateuszzz
Tue, 22 Mar 2011 06:52
zestawienie zbiorcze
Author: Mateuszzz
Date: Tue, 22 Mar 2011 06:52
Date: Tue, 22 Mar 2011 06:52
28 lines
1971 bytes
1971 bytes
Witam, mam kilka plików tekstowych (w wielu podfolderach) zawierających statystyki z których chciałbym stworzyć jeden plik wynikowy. Przykładowo, jeśli obecnie zawartość jednego z nich wygląda następująco: max 120 min 100 mean 110 to w przypadku połączenia 3. plików, chciałbym. aby wynik wyglądał w ten sposób pierwszy_plik drugi_plik trzeci_plik max 120 130 140 min 100 110 115 mean 105 125 130 Niestety nie znam optymalnego sposobu wykonania tej operacji - myślałem o stworzeniu dwóch pętli (w jednej odczytanie zawartości pierwszego pliku, użycie polecenia split w celu wydobycia samych wartości, po czym otwarcie pliku wynikowego i wypisywanie w zmiennej pomocniczej wartości poszczególnych lini + spacja + wartość z pojedynczego pliku). Czy istnieje gotowe narzędzie do wykonania tej operacji ? Jeśli w jakikolwiek sposób ułatwia to sprawę, to wynik może być zapisywany przy pomocy pyUno bądź pyExcelerator do arkusza.
Re: zestawienie zbiorcze
Author: Adam Przybyla
Date: Tue, 22 Mar 2011 07:24
Date: Tue, 22 Mar 2011 07:24
34 lines
2148 bytes
2148 bytes
Mateuszzz <km_wawaUSUNMNIE@vp.pl> wrote: > Witam, > > mam kilka plików tekstowych (w wielu podfolderach) zawierających > statystyki z których chciałbym stworzyć jeden plik wynikowy. > Przykładowo, jeśli obecnie zawartość jednego z nich wygląda następująco: > > max 120 > min 100 > mean 110 > > to w przypadku połączenia 3. plików, chciałbym. aby wynik wyglądał w ten > sposób > > pierwszy_plik drugi_plik trzeci_plik > max 120 130 140 > min 100 110 115 > mean 105 125 130 > > Niestety nie znam optymalnego sposobu wykonania tej operacji - myślałem > o stworzeniu dwóch pętli (w jednej odczytanie zawartości pierwszego > pliku, użycie polecenia split w celu wydobycia samych wartości, po czym > otwarcie pliku wynikowego i wypisywanie w zmiennej pomocniczej wartości > poszczególnych lini + spacja + wartość z pojedynczego pliku). > > Czy istnieje gotowe narzędzie do wykonania tej operacji ? > > Jeśli w jakikolwiek sposób ułatwia to sprawę, to wynik może być > zapisywany przy pomocy pyUno bądź pyExcelerator do arkusza. ... moze tak: import sys print "\n".join([" ".join(x) for x in zip([["max","min","mean"]]+[[w.strip().split()[1] for w in for file(f).readlines()] for f in sys.argv[1:]])]) Z powazaniem Adam Przybyla
Re: zestawienie zbiorcze
Author: Mateuszzz
Date: Tue, 22 Mar 2011 12:23
Date: Tue, 22 Mar 2011 12:23
10 lines
1586 bytes
1586 bytes
> import sys > print "\n".join([" ".join(x) for x in zip([["max","min","mean"]]+[[w.strip().split()[1] for w in for file(f).readlines()] for f in sys.argv[1:]])]) Dziękuję. Jeśli dobrze rozumiem jako argumenty skryptu mam podać wszystkie nazwy plików (sys.argv[1:] - czyli wektor nazw ?) Nie mam doświadczeń w obiektach typu tuple - czy w kolejnych iteracjach nie zaczną się powtarzać napisy max, min i mean ?
Re: zestawienie zbiorcze
Author: Szyk
Date: Tue, 22 Mar 2011 13:08
Date: Tue, 22 Mar 2011 13:08
11 lines
1595 bytes
1595 bytes
deklarujesz tablice: min, max, mean robisz pętlę z os.walk na katalogu w którym masz pliki w pętli odczytujesz interesujące wartości do tablic tworzysz plik csv () i wpisujesz do niego dane wierszami To chyba najprostrze, choć zużywa dużo pamięci na tablice (tak by nie było by gdybyś chciał organizować dane kolumnami a nie wierszami). CSV to chyba najprostrzy sposub na utworzenie arkusza dla Excela/Calca bo python ma standardowy moduł do obsługi tych plików (http://docs.python.org/release/3.0.1/library/csv.html).
Re: zestawienie zbiorcze
Author: Adam Przybyla
Date: Tue, 22 Mar 2011 14:11
Date: Tue, 22 Mar 2011 14:11
13 lines
1455 bytes
1455 bytes
Mateuszzz <km_wawaUSUNMNIE@vp.pl> wrote: >> import sys >> print "\n".join([" ".join(x) for x in zip([["max","min","mean"]]+[[w.strip().split()[1] for w in for file(f).readlines()] for f in sys.argv[1:]])]) > > > Dziękuję. > Jeśli dobrze rozumiem jako argumenty skryptu mam podać wszystkie nazwy > plików (sys.argv[1:] - czyli wektor nazw ?) > > Nie mam doświadczeń w obiektach typu tuple - czy w kolejnych iteracjach > nie zaczną się powtarzać napisy max, min i mean ? ... nie. Z powazaniem Adam Przybyla
Re: zestawienie zbiorcze
Author: Mateuszzz
Date: Sat, 26 Mar 2011 17:22
Date: Sat, 26 Mar 2011 17:22
18 lines
1850 bytes
1850 bytes
Witam ponownie Szanowni Grupowicze, ciągle nie radzę sobie z poleceniem join - ostatecznie zrezygnowałem z łączenia statystyk - chcę zrobić coś znacznie prostszego - mam pliki w postaci: wspolX wspolY wartosc (oddzielone spacjami, wiec moze najlatwiej bedzie to wykonac przez csv) chcę, aby pętla "przeleciała" po wszystkich plikach w katalogu i dopisala do pliku zbiorczego wartosci (wspolrzedne sa raczej te same) Niestety - nie wiem z jakiego powodu - wychodza mi straszne glupoty (wycinalem znaki konca linii przy pomocy rstrip). Czy moglbym prosic o szkielet ? Przykladowy skrypt wykonujacy taka operację ? Byc moze jest to okropnie proste, ale siedze zdesperowany od kilku godzin bezmyslnie wpisujac komendy - przyda mi się jakis przelom...
Re: zestawienie zbiorcze
Author: Adam Przybyla
Date: Sat, 26 Mar 2011 17:54
Date: Sat, 26 Mar 2011 17:54
22 lines
1904 bytes
1904 bytes
Mateuszzz <km_wawaUSUNMNIE@vp.pl> wrote: > Witam ponownie Szanowni Grupowicze, > > ciągle nie radzę sobie z poleceniem join - ostatecznie zrezygnowałem z > łączenia statystyk - chcę zrobić coś znacznie prostszego - mam pliki w > postaci: > > wspolX wspolY wartosc (oddzielone spacjami, wiec moze najlatwiej bedzie > to wykonac przez csv) > > chcę, aby pętla "przeleciała" po wszystkich plikach w katalogu i > dopisala do pliku zbiorczego wartosci (wspolrzedne sa raczej te same) > Niestety - nie wiem z jakiego powodu - wychodza mi straszne glupoty > (wycinalem znaki konca linii przy pomocy rstrip). > Czy moglbym prosic o szkielet ? Przykladowy skrypt wykonujacy taka > operację ? > > Byc moze jest to okropnie proste, ale siedze zdesperowany od kilku > godzin bezmyslnie wpisujac komendy - przyda mi się jakis przelom... ... poslij swoj skrypt na grupe, bo "wrozek" to nikt tu nie jest;-) Z powazaniem Adam Przybyla
Re: zestawienie zbiorcze
Author: Mateuszzz
Date: Sat, 26 Mar 2011 18:11
Date: Sat, 26 Mar 2011 18:11
34 lines
2248 bytes
2248 bytes
zbiorcze = folder_serw + zmienna + ".txt"
if not os.path.isfile(zbiorcze):
shutil.copy(plik2, zbiorcze)
else:
#otwieramy pliki i wczytujemy zawartosc
plik_obecny=open(plik2,'r')
kolumna=[]
for linia in plik_obecny:
m=linia.split(" ")
element=m[2]
element=str(element)
kolumna.append(element)
plik_obecny.close()
plik_uzup=open(zbiorcze,'r')
zawartosc=""
##
# WIEM ZE TO CO JEST DALEJ JEST TROCHE BEZ SENSU - jednak wstawiajac w #
w obrebie petli instrukcje n+=1 otrzymywalem komunikat, ze chce
#####pobrac wartosc spoza zakresu
n=0
for linia in plik_uzup:
dodawany_element=kolumna[n]
dodawany_element=str(dodawany_element)
linia=str(linia)
linia.rstrip()
zawartosc=zawartosc+linia+" "+dodawany_element+"\n"
plik_uzup.close()
os.remove(zbiorcze)
plik_uzup=open(zbiorcze,'w')
plik_uzup.write(zawartosc)
plik_uzup.close()
Re: zestawienie zbiorcze
Author: Daniel Mróz
Date: Mon, 28 Mar 2011 15:06
Date: Mon, 28 Mar 2011 15:06
71 lines
3348 bytes
3348 bytes
On 26.03.2011, Mateuszzz <km_wawaUSUNMNIE@vp.pl> wrote:
> zbiorcze = folder_serw + zmienna + ".txt"
Nie wiem skąd masz "zmienna", ale jeśli "z zewnątrz", to bym na Twoim
miejscu sprawdził czy nie zawiera czegoś, co pozwoli pójść tam, gdzie
nie powinno ("..").
> if not os.path.isfile(zbiorcze):
> shutil.copy(plik2, zbiorcze)
> else:
> #otwieramy pliki i wczytujemy zawartosc
> plik_obecny=open(plik2,'r')
Brak obsługi błędu otwarcia pliku.
> kolumna=[]
> for linia in plik_obecny:
> m=linia.split(" ")
> element=m[2]
Nie obsługujesz wyjątku. Jeśli linia będzie zawierała mniej niż 3 elementy
rozdzielone spacjami, Twój skrypt wyleci.
> element=str(element)
element już chyba jest stringiem. Nie?
> kolumna.append(element)
A nie prościej(?):
kolumna.append(m[2])
Jednej zmiennej i dwóch instrukcji mniej.
> plik_obecny.close()
Ponoć teraz "with" jest "the right way".
> plik_uzup=open(zbiorcze,'r')
Brak obsługi błędu otwarcia pliku.
> zawartosc=""
> ##
> # WIEM ZE TO CO JEST DALEJ JEST TROCHE BEZ SENSU - jednak wstawiajac w #
> w obrebie petli instrukcje n+=1 otrzymywalem komunikat, ze chce
> #####pobrac wartosc spoza zakresu
No to daj w tym miejscu:
print(kolumna)
i zobacz dlaczego Ci krzyczy.
Taki błąd dostaniesz też w przypadku, gdy plik_uzup zawiera więcej linii
niż plik_obecny. Sprawdziłeś? Nie masz nawet obsługi takiego przypadku
(i sensownej obsługi błędów w ogólności).
> n=0
> for linia in plik_uzup:
> dodawany_element=kolumna[n]
> dodawany_element=str(dodawany_element)
> linia=str(linia)
Po co Ci te dwie ostatnie linie?
> linia.rstrip()
To można wrzucić do generatora w "for"
> zawartosc=zawartosc+linia+" "+dodawany_element+"\n"
Czytelniej:
zawartosc += "{0} {1}\n".format(linia, dodawany_element)
Pozdrawiam
Beorn
--
Daniel 'Beorn' Mróz <beorn@alpha.pl> http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*]
[ r++ y+ ]
Re: zestawienie zbiorcze
Author: Daniel Mróz
Date: Mon, 28 Mar 2011 15:28
Date: Mon, 28 Mar 2011 15:28
67 lines
2472 bytes
2472 bytes
On 26.03.2011, Mateuszzz <km_wawaUSUNMNIE@vp.pl> wrote:
> Czy moglbym prosic o szkielet ? Przykladowy skrypt wykonujacy taka
> operację ?
Nie wiem czy to jest dokładnie to, co chciałeś zrobić w przytoczonym
przez siebie kodzie, ale na szkielet się chyba nada:
[beorn@nika tmp]$ cat data1.txt
1 2 AAA
3 4 BBB
5 6 CCC
[beorn@nika tmp]$ cat data2.txt
1 2
3 4
5 6
[beorn@nika tmp]$ cat test.py
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import sys
FILE1 = "data1.txt"
FILE2 = "data2.txt"
FILEO = "out.txt"
try:
fh1 = open(FILE1, 'r')
fh2 = open(FILE2, 'r')
fho = open(FILEO, 'w')
except Exception, ex:
sys.stderr.write('Failed to open file: {0}'.format(': '.join(( str(x) for x in ex.args))))
sys.exit(1)
while True:
line1 = fh1.readline().strip('\n')
line2 = fh2.readline().strip('\n')
if '' in (line1, line2):
break
elements = line1.split(' ')
if len(elements) != 3:
sys.stderr.write('Syntax error: {0}\n'.format(elements))
sys.exit(2)
fho.write('{0} {1}\n'.format(line2, elements[2]))
fh1.close()
fh2.close()
fho.close()
[beorn@nika tmp]$ python test.py
[beorn@nika tmp]$ cat out.txt
1 2 AAA
3 4 BBB
5 6 CCC
Pozdrawiam
Beorn
--
Daniel 'Beorn' Mróz <beorn@alpha.pl> http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*]
[ r++ y+ ]
Re: zestawienie zbiorcze
Author: Szyk
Date: Mon, 28 Mar 2011 19:47
Date: Mon, 28 Mar 2011 19:47
7 lines
1362 bytes
1362 bytes
Daj 3 pliki przykładowe i 5 dyszek a wystrugam Ci ten skrypt w jeden wieczór. Taniej Ci to wyjdzie, bo teraz tracisz godziny. pozdrawia Szyk
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads