🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
11 messages
11 total messages Started by Mateuszzz Tue, 22 Mar 2011 06:52
zestawienie zbiorcze
#27946
Author: Mateuszzz
Date: Tue, 22 Mar 2011 06:52
28 lines
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
#27947
Author: Adam Przybyla
Date: Tue, 22 Mar 2011 07:24
34 lines
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
#27948
Author: Mateuszzz
Date: Tue, 22 Mar 2011 12:23
10 lines
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
#27950
Author: Szyk
Date: Tue, 22 Mar 2011 13:08
11 lines
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
#27949
Author: Adam Przybyla
Date: Tue, 22 Mar 2011 14:11
13 lines
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
#27951
Author: Mateuszzz
Date: Sat, 26 Mar 2011 17:22
18 lines
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
#27952
Author: Adam Przybyla
Date: Sat, 26 Mar 2011 17:54
22 lines
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
#27953
Author: Mateuszzz
Date: Sat, 26 Mar 2011 18:11
34 lines
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
#27954
Author: Daniel Mróz
Date: Mon, 28 Mar 2011 15:06
71 lines
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
#27955
Author: Daniel Mróz
Date: Mon, 28 Mar 2011 15:28
67 lines
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
#27956
Author: Szyk
Date: Mon, 28 Mar 2011 19:47
7 lines
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