touch
to narzędzie uniksowe, które ustawia czasy modyfikacji i dostępu do plików na bieżącą porę dnia. Jeśli plik nie istnieje, jest tworzony z domyślnymi uprawnieniami.
Jak zaimplementowałbyś to jako funkcję Pythona? Staraj się być wieloplatformowy i kompletny.
(Bieżące wyniki Google dla „pliku dotykowego python” nie są tak świetne, ale wskazują na os.utime .)
touch
podobną funkcjonalność w swoich programach Python, a nie jak ponownie wdrożyć ją od zera; najlepiej obsłużyć tych ludzi, przewijając w dół dopathlib
rozwiązania. Mimo że jest teraz wbudowany, ta odpowiedź ma znacznie lepszy ranking Google dla „pliku dotykowego python” niż odpowiednia dokumentacja .Odpowiedzi:
Wygląda na to, że jest to nowa wersja Python 3.4 -
pathlib
.Spowoduje to utworzenie
file.txt
ścieżki.-
źródło
pip install pathlib
Path('/some/path').mkdir()
jeśli katalog zawierający plik dotouch()
edycji nie istnieje.pathlib2
zamiast,pathlib
ponieważ terazpathlib
jest tylko poprawka błędów. Dlatego w Pythonie 2.7:pip install pathlib2
a następniefrom pathlib2 import Path
.To stara się być trochę bardziej wolne od wyścigów niż inne rozwiązania. (Słowo
with
kluczowe jest nowe w Pythonie 2.5.)Z grubsza to odpowiada.
Teraz, aby naprawdę był wolny od wyścigów, musisz użyć
futimes
i zmienić znacznik czasu otwartego uchwytu pliku, zamiast otwierać plik, a następnie zmieniać znacznik czasu w nazwie pliku (który mógł zostać zmieniony). Niestety, wydaje się, że Python nie zapewnia sposobu dzwonieniafutimes
bez przechodzenia przezctypes
lub podobne ...EDYTOWAĆ
Jak zauważył Nate Parsons , Python 3.3 doda określenie deskryptora pliku (kiedy
os.supports_fd
) do funkcji takich jakos.utime
, które będą używaćfutimes
syscall zamiastutimes
syscall pod maską. Innymi słowy:źródło
file
funkcja została usunięta z Python 3 iopen
należy jej użyć. Całkowicie mi tego brakowało, ponieważ podświetlanie składni edytora, którego używam (gedit), wciąż jest skierowane do Pythona 2.źródło
open()
wywołania przez tę funkcję , zawartość pliku zostanie obcięta.'a'
Zamiast tego sugeruj użycie trybu .open(fname, 'a').close()
nie zmieni się w tym momencie.os.utime()
dla wcześniej istniejących plików.Dlaczego nie spróbować ?:
Wierzę, że to eliminuje wszelkie ważne warunki wyścigu. Jeśli plik nie istnieje, zostanie zgłoszony wyjątek.
Jedynym możliwym warunkiem wyścigu jest to, że plik zostanie utworzony przed wywołaniem open (), ale po os.utime (). Nie ma to jednak znaczenia, ponieważ w tym przypadku czas modyfikacji będzie zgodny z oczekiwaniami, ponieważ musiał nastąpić podczas wywołania touch ().
źródło
Oto kod używający ctypów (testowany tylko w systemie Linux):
źródło
Ta odpowiedź jest kompatybilna ze wszystkimi wersjami od wersji Python-2.5, kiedy słowo kluczowe
with
zostało zwolnione.1. Utwórz plik, jeśli nie istnieje + Ustaw aktualny czas
(dokładnie taki sam jak polecenie
touch
)Bardziej niezawodna wersja:
2. Wystarczy utworzyć plik, jeśli nie istnieje
(nie aktualizuje czasu)
3. Po prostu zaktualizuj czasy dostępu do pliku / modyfikacji
(nie tworzy pliku, jeśli nie istnieje)
Korzystanie
os.path.exists()
nie upraszcza kodu:Bonus: Czas aktualizacji wszystkich plików w katalogu
źródło
źródło
with open(fn,'a'): pass
lub alternatywnieopen(fn, 'a').close()
nie zmieniaj zmodyfikowanego czasu za pomocą Pythona 2.7.5 na Red Hat 7 (system plików to XFS). Na mojej platformie rozwiązania te tworzą po prostu pusty plik, jeśli nie istnieje. : - /Uproszczony:
open
eliminuje ryzyko istnieje plikutime
gwarantuje, że znaczniki czasu są aktualizowaneTeoretycznie możliwe jest, że ktoś usunie plik po
open
, powodując, że utime zgłosi wyjątek. Ale to chyba w porządku, ponieważ stało się coś złego.źródło
Złożony (prawdopodobnie wadliwy):
Próbuje to również umożliwić ustawienie czasu dostępu lub modyfikacji, takich jak GNU touch.
źródło
Logiczne może się wydawać utworzenie łańcucha z pożądanymi zmiennymi i przekazanie go do os.system:
Jest to niewystarczające na wiele sposobów (np. Nie obsługuje białych znaków), więc nie rób tego.
Bardziej niezawodną metodą jest użycie podprocesu:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Chociaż jest to znacznie lepsze niż używanie podpowłoki (z os.system), nadal nadaje się tylko do szybkich i brudnych skryptów; użyj przyjętej odpowiedzi dla programów wieloplatformowych.
źródło
subprocess.call(['touch', os.path.join(dirname, fileName)])
jest znacznie lepsze niż używanie podpowłoki (zos.system
). Ale nadal używaj tego tylko do szybkich i brudnych skryptów, użyj akceptowanej odpowiedzi dla programów wieloplatformowych.touch
nie jest poleceniem dostępnym dla wielu platform (np. Windows)„open (nazwa_pliku,„ a ”). close ()” nie działało dla mnie w Pythonie 2.7 w systemie Windows. „os.utime (nazwa_pliku, Brak)” działało dobrze.
Musiałem też rekursywnie dotykać wszystkich plików w katalogu z datą starszą niż jakaś data. Stworzyłem następujące na podstawie bardzo pomocnej odpowiedzi Ephemient.
źródło
Dlaczego nie spróbujesz: newfile.py
lub
źródło
Wystarczy:
Jeśli chcesz ustawić określony czas dotyku, użyj os.utime w następujący sposób:
Tutaj atime i mtime powinny być int / float i powinny być równe czasowi epoki w sekundach do czasu, który chcesz ustawić.
źródło
Jeśli nie przeszkadza ci próba, z wyjątkiem ...
Należy jednak zauważyć, że jeśli plik o tej samej nazwie istnieje, nie będzie działał i po cichu zawiedzie.
źródło
write_text()
zpathlib.Path
można użyć.źródło