Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Kontrola zavírání souboru

Aktivity
Avatar
pgarsky
Člen
Avatar
pgarsky:20.5.2019 22:14

Ahoj,
píšu si script pro upravování TXT souborů (viz kód níže).
Pro otevření souboru používám příkaz os.startfile() a potřebuji poradit, jak kontrolovat, zda je soubor ještě otevřený a v případě zavření mít možnost provést blok dalších příkazů.

Zkusil jsem:

#!/usr/bin/env python3

import os
import base64

f = "info.txt"
temp = "temp.txt"

if os.path.exists(f):
    info = open(f, 'r')
    text = base64.b64decode(info.read()).decode('UTF-8')
    #create temporary file and open it

    with open(temp, 'w') as temp:
        #write text from info to temporary file
        temp.write(text)
        #open temporary file
        tempFile = os.startfile("temp.txt")
        #while ... is not closed ... write ... else ... encode and save to info (rewrite)
        #delete temporary file
    #<end script>

Chci docílit: Jak tedy kontrolovat, zda soubor nebyl zavřen klasickým křížkem ve Windows?

Děkuji.

Odpovědět
20.5.2019 22:14
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Erik Šťastný:21.5.2019 8:28

Ahoj, nevím co myslíš tím "zda soubor nebyl zavřen klasickým křížkem ve Windows?" Myslíš zavření jiné aplikace, která má soubor otevřený?

Mimochodem měl by jsi sjednotit otevírání souborů.

  • open(f, 'r')
  • with open(temp, 'w')
 
Nahoru Odpovědět
21.5.2019 8:28
Avatar
Odpovídá na Erik Šťastný
Michal Haňáček:21.5.2019 9:59

Jen doplnim, ze "with open" drzi soubor otevreny az do konce bloku ... to je mozna odpoved na otazku pgarsky

Nahoru Odpovědět
21.5.2019 9:59
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
pgarsky
Člen
Avatar
Odpovídá na Erik Šťastný
pgarsky:21.5.2019 18:03

Ano, přesně tak to myslím.

Jak sjednotit?

Nahoru Odpovědět
21.5.2019 18:03
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Erik Šťastný:21.5.2019 18:35

Používáte dva způsoby, které jsou určeny na stejnou věc, rozdíl řekl Michal.

Doporučuju vždy používat

with open()
 
Nahoru Odpovědět
21.5.2019 18:35
Avatar
pgarsky
Člen
Avatar
Odpovídá na Erik Šťastný
pgarsky:21.5.2019 19:09

A jak je myšleno to sjednocení? Takhle?

#!/usr/bin/env python3

import os
import base64

f = "info.txt"
temp = "temp.txt"

if os.path.exists(f):
    #create temporary file and open it
    with open(temp, 'w') as temp:
        info = open(f, 'r')
        text = base64.b64decode(info.read()).decode('UTF-8')
        #write text from info to temporary file
        temp.write(text)
        #open temporary file
        tempFile = os.startfile("temp.txt")
        #while ... is not closed ... write ... else ... encode and save to info (rewrite)
        #delete temporary file
    #<end script>
Nahoru Odpovědět
21.5.2019 19:09
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Michal Haňáček:22.5.2019 6:56

Ne. Ty používáš dvě konstrukce pro tu stejnou věc s tím že jenom atributem říkáš, že jeden soubor otevíráš pro čtení a druhý pro zápis (

open(f, 'r')

a

with open(temp, 'w')

). Pokud otevíráš soubor přes první konstrukci (open), tak by jsi celý ten kód měl volat v try-finally bloku, kde v části finally soubor uzavřes. Když použiješ druhou konstrukci (with open) tak blok try finally dělat nemusíš, protože se to děje automaticky.

Čili upravený kód by mohl vypadat např takto

#!/usr/bin/env python3

import os
import base64

f = "info.txt"
temp = "temp.txt"

if os.path.exists(f):
    with open(f, 'r') as input:
        text = base64.b64decode(input.read()).decode('UTF-8')

    #create temporary file and open it
    with open(temp, 'w') as temp:
        #write text from info to temporary file
        temp.write(text)
        #open temporary file
        tempFile = os.startfile("temp.txt")
        #while ... is not closed ... write ... else ... encode and save to info (rewrite)
        #delete temporary file
    #<end script>

Případně bloky do sebe vhodně zanořit s ohledem na to co vlastně děláš, nebo co má výt výsledkem.

Snad to má hlavu, patu a pomohl jsem ti alespoň trochu.

Pozn. kód jsem upravoval v browseru, s největší pravděpodobností bude nevalidní ...

Nahoru Odpovědět
22.5.2019 6:56
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal Haňáček
pgarsky:22.5.2019 21:10

Děkuji. A jak tedy mohu kontrolovat, zda je otevřená aplikace, ve které jsem ten TXT soubor otevřel?

Nahoru Odpovědět
22.5.2019 21:10
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Michal Haňáček:23.5.2019 6:36

To přeci kontrolovat nemusíš ... nebo jsem možná nepochopil čeho chceš docílit, ale zatím z toho mám dojem že sám sobě trochu házíš klacky pod nohy.

Nahoru Odpovědět
23.5.2019 6:36
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal Haňáček
pgarsky:24.5.2019 16:27

Je nemluvím o otevření souboru pomocí open(), já myslím otevření souboru pomocí os.startfile()

Nahoru Odpovědět
24.5.2019 16:27
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Michal Haňáček:24.5.2019 17:10

Pockej, ted tomu asi nerozumim. Ty chces po systemu aby ti otevral soubor, ktery sam drzis pro zapis? A kontrolovat jestli je jeste otevreny?

Jestli jsem to pochopil spravne, tak se obavam se ze to takhle jednoduse neudelas ... a odpoved na to co se ptas se da zjistit do minuty mrknutim do dokumentace , kde se pise

startfile() returns as soon as the associated application is launched. There is no option to wait for the application to close, and no way to retrieve the application’s exit status.

Nahoru Odpovědět
24.5.2019 17:10
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal Haňáček
pgarsky:24.5.2019 17:54

A nějaká jiná možnost není? Třeba s použitím jiného příkazu, než startfile() ?

Nahoru Odpovědět
24.5.2019 17:54
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Michal Haňáček:24.5.2019 18:49

Muzes mi prosim nejak popsat (klidne SZ pokud se ti nechce sem) co od toho kodu vlastne chces a proc, treba nejake reseni najdeme.

Nahoru Odpovědět
24.5.2019 18:49
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal Haňáček
pgarsky:25.5.2019 18:28

Napsal jsem SZ, pokud najdeme řešení, postnu ho sem.

Nahoru Odpovědět
25.5.2019 18:28
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.