Potrzebuję zaktualizować plik. Przeczytałem to i zapisałem ze zmianami. Wolę jednak pisać do pliku tymczasowego i zmienić jego nazwę na miejsce.W pythonie, należy utworzyć plik tempfile w tym samym katalogu, co inny plik?
temp = tempfile.NamedTemporaryFile()
tempname = temp.name
temp.write(new_data)
temp.close()
os.rename(tempname, data_file_name)
Problemem jest to, że tempfile.NamedTemporaryFile()
sprawia plik tymczasowy w /tmp
który jest inny system plików. Oznacza to, że nie powiodło się os.rename()
. Jeśli użyję zamiast tego shlib.move()
, to nie mam aktualizacji atomowej, którą zapewnia "mv" (dla plików w tym samym systemie plików, Yadda, Yadda itp.).
Wiem, że tempfile.NamedTemporaryFile()
przyjmuje parametr "dir", ale data_file_name może być "foo.txt", w takim przypadku dir = '.'; lub data_file_name może być "/path/to/the/data/foo.txt
", w takim przypadku dir = "/path/to/the/data
".
Co naprawdę chciałbym to plik tymczasowy to data_file_name + "kilka losowych danych". Miałoby to tę zaletę, że zawiodło w sposób, który pozostawiłby po sobie przydatne wskazówki.
Sugestie?
Dlaczego w pierwszej kolejności używasz pliku tymczasowego, jeśli nie chcesz, aby został on umieszczony w katalogu plików tymczasowych? Co przemawia przeciwko używaniu zwykłych plików? –
David: Chcę użyć pliku tymczasowego, ponieważ chcę, aby aktualizacja była atomowa (lub atomowa, jak można z os.rename()). Oznacza to, że jeśli system plików zapełni się lub jest jakiś inny problem, nie chcę, aby plik był napisany w połowie. – TomOnTime
Może to być trudne do osiągnięcia, ponieważ nigdy nie wiadomo, czy pliki zapisane w innym folderze znajdują się w tym samym systemie plików, co katalog lokalny. Widzę zaletę organizowania danych wyjściowych w rodzaju zatwierdzenia. Aby być względnie pewnym, że tak jest, prawdopodobnie zarządzałbym własnym katalogiem tymczasowym - chociaż wtedy dbasz również o porządkowanie tego folderu. –