Skocz do zawartości

[python] Jak Rozpoznać Plik Tekstowy


borzole

Rekomendowane odpowiedzi

W jaki sposób można rozpoznać, czy dany plik jest plikiem tekstowym w python?

Początkowo użyłem mimetype z powłoki i pierwszej sekwencji text/cokolwiek, ale szybko okazało się, że np. pliki xml to application/.... Teraz myślę, że lepiej użyć programy file i wyłuskać "text", ale może jest jakaś funkcja w czystym pythonie?

Odnośnik do komentarza
Udostępnij na innych stronach

Może sprawdzić czy plik zawiera tylko znaki z danego zakresu(białe, alfanumeryczne..co tam jeszcze w plikach tekstowych jest). Ja bym wykorzystał do tego moduł re. Pliki binarne maja jakieś krzaki. Ale sprawiło by tu problem różne kodowanie znaków. Jak ci się nie spieszy to jutro będę miał czas to pomyśle o tym.

Odnośnik do komentarza
Udostępnij na innych stronach

Sprawdzanie całego pliku pod kątem znaków? No nie wiem, pliki potrafią być spore. Myślałem raczej o czymś, co czyta nagłówek pliku i sprawdza tzw. "magic number"/ "magic bytes"? Niestety to co znalazłem jest przerostem formy: magic.py. Ja tylko potrzebuje wiedzieć, czy dany plik otworzy się w notatniku.

Odnośnik do komentarza
Udostępnij na innych stronach

Masz 2 możliwości:

  1. wykorzystać kod z magic.py + uprościć, bo ty nie musisz wiedzieć jaki to jest plik ale czy możesz go edytować w notatniku, czyli wybrać co ci pasuje z tej listy którą masz w magic.py(szybsze)
  2. przeczytanie pliku i sprawdzenie ile tam jest znaków które są tekstem.. mniej więcej coś takiego: test-if-a-file-or-string-is-text-or-binary(prostrze w implementacji)

A w jaki sposób byś wykorzystywał tą funkcjonalność?

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli liczy się szybkość, zmodyfikowałbym magic.py. Magic number będą najwydajniejszym rozwiązaniem. Po zajęciach(po 15) coś więcej tu skrobnę.

 

nautilus-python jak działa? Trzyma jedną instancje skryptu wraz z nautilusem czy na każdym otarciem katalogu ładuje na nowo skrypt?

Odnośnik do komentarza
Udostępnij na innych stronach

@hello_world, ale żeby wyłuskać z tego wszystko co jest text/* plus np xml i inne application/* które są czytelne dla gedita trzeba się sporo napisać i będzie to równoważne z skorzystaniem z magic.py.

 

@borzole, może by tak istniała taka opcja tylko dla plików normalnie edytowalnych przez gedit?(z uwzględnieniem tych plików dla których gedit nie jest domyślnym edytorem, ale znajduje się na liście 'Otwórz za pomocą'):

 

# wymaga zainstalowanego: gnome-python2-gnomevfs
import gnomevfs
def is_gopen(file_path):
    """
    Sprawdza czy gedit jest edytorem podanego pliku.
    Argumenty:
    - `file_path`: scierzka do pliku.
    """
    mime = gnomevfs.get_file_mime_type(file_path)
    return 'gedit' in [i[2] for i in gnomevfs.mime_get_short_list_applications(mime)]

 

Było by to zintegrowane z tym co w GNOME mamy ustawione, jeśli chce dany plik otwierać poprzez nautilus-python-eigs musiałby tylko dodać go do listy pod klikając na pliku lpm(czyli tak jak zawsze się to robi).

Odnośnik do komentarza
Udostępnij na innych stronach

* po pierwsze wybrałem nautilus-python, bo wreszcie działa na 64bitach i chciałem się tym zwyczajnie pobawić :)

* myślę, że z tego wszystkiego będzie kicha, bo głównym założeniem jest by można było edytować plik jako root, ale rozpoznanie typu pliku jest jako user. Sęk w tym, że plik może mieć ustawione prawa 700 jako root i co wówczas ? ale się właśnie przejechałem :(

* to co podałeś, jest na pewno bardzo fajne, ale w związku z powyższym, muszę przemyśleć całą ideę jak to zrobić.

* problemem jest również sam edytor, jeśli posłużę się tym co proponujesz, wówczas muszę założyć, że każdy ma ustawiony geany/gedit jako domyślny dla danego typu plików. Sęk w tym, że otwarcie nie jest uniwersalne, tylko przez nakładkę pam+consolehelper dla konkretnej aplikacji. To nie jest gksudo.

* jasne, że można to ustawić jako zwykłe "otwórz za pomocą" i wskazać aplikację, ale ja chcę to zrobić w nautilus-python zwyczajnie "for fun". A poza tym tak będzie bardziej "user friendly": gość klika i od razu wie, że może edytować plik jako root.

* ...nom, to zrobiłem krok wstecz i wróciłem do poszukiwania idei jak w ogóle dodać opcję "edytuj jako root", pojawiającą się tylko na plikach tekstowych

Odnośnik do komentarza
Udostępnij na innych stronach

* po pierwsze wybrałem nautilus-python, bo wreszcie działa na 64bitach i chciałem się tym zwyczajnie pobawić :)

Ja nie miałem nigdy do niego cierpliwości, kiedy ostano go sprawdzałem nie byo prawie dokumentacji i mało co to mogło w porównaniu z wersja dla C.

* myślę, że z tego wszystkiego będzie kicha, bo głównym założeniem jest by można było edytować plik jako root, ale rozpoznanie typu pliku jest jako user. Sęk w tym, że plik może mieć ustawione prawa 700 jako root i co wówczas ? ale się właśnie przejechałem :(

moje rozważanie sprawdza czy plik może otworzyć gedit też dla plików roota z 700(jako user). Czy jest potrzeba by plik edytować jako root sprawdziłbym coś ala(zwraca False też dla plików innych użytkowników niż root ale do których nie mamy dostępu):

import pwd, os
def root_required(file_path):
    if os.access(file_path, os.W_OK):
        return False
    else:
        st = os.stat(file_path)
        #wolniejsze ale odporne na zmine uid przez roota
        return pwd.getpwuid(st[stat.ST_UID])[0]=='root'
        #szybkie ale znamiana uid przez roota psuje:
        #return st[stat.ST_UID]==0

 

* problemem jest również sam edytor, jeśli posłużę się tym co proponujesz, wówczas muszę założyć, że każdy ma ustawiony geany/gedit jako domyślny dla danego typu plików. Sęk w tym, że otwarcie nie jest uniwersalne, tylko przez nakładkę pam+consolehelper dla konkretnej aplikacji. To nie jest gksudo.

Sam dodatek chyba zakłada ze będzie zainstalowany gedit, gedit standardowo jest edytorem do bardzo dużej ilości plików. Jak ktoś zmienia edytor domyślny to nie usuwa poprzedniego z listy otwórz jako. Wystarczy ze na tej liście będzie gedit i moje rozwiązanie zadziała. Jak jakiś plik bedzie ciachał edytować z prawami root starczy że doda gedit do listy programów otwierających dany plik(nie musi od razu gedit być domyślnym edytorem).

* jasne, że można to ustawić jako zwykłe "otwórz za pomocą" i wskazać aplikację, ale ja chcę to zrobić w nautilus-python zwyczajnie "for fun". A poza tym tak będzie bardziej "user friendly": gość klika i od razu wie, że może edytować plik jako root.

Wydaje się mi że mój pomysł jest 'juser frenli':D, ale zawsze miałem problem z projektowaniem gui aplikacji wiec na przyjazności dla użytkownika się średnio znam.

 

-------

PS. @borzole, przechowujesz kodzik może na jakimś svn czy coś takiego? w ramach odreagowywania od nauki bym pomógł ci z kodzeniem bo taki dodatek i mi by się przydał.

Odnośnik do komentarza
Udostępnij na innych stronach

przechowujesz kodzik może na jakimś svn czy coś takiego? w ramach odreagowywania od nauki bym pomógł ci z kodzeniem bo taki dodatek i mi by się przydał.

* nie, bo to raptem ~50 linii kodu przy czym dopisałem tylko 5 linijek to przykładu z dokumentacji. :)

* jak chcesz się pobawić to rozpakuj: geany-super oraz nautilus-python-eigs

tam są dwa proste makefile'e. Żeby to działało dla gedit to wystarczy wszędzie nazwy pozmieniać, albo zajrzeć tu: wiki/consolehelper

* skoro mówisz, że przydało by Ci się coś takiego, to dodaj repo wiki-pl i zainstaluj

yum install nautilus-python-oins

zrestartuj nautilusa "nautilus -q"

To otwiera folder w nautilusie na prawach roota. Tutaj sytuacja była znacznie prostsza.

Odnośnik do komentarza
Udostępnij na innych stronach

z tymi prawami dostępu to jednak jest ciekawa sprawa:

$ ls -l /boot/grub/grub.conf
-rw------- 1 root root 615 Jun 15 23:02 /boot/grub/grub.conf

$ file /boot/grub/grub.conf
/boot/grub/grub.conf: regular file, no read permission

$ mimetype /boot/grub/grub.conf
/boot/grub/grub.conf: text/plain

dlaczego mimetype zadziałało na pliku, do którego nie mam prawa odczytu?

Odnośnik do komentarza
Udostępnij na innych stronach

/boot/grub/grub.conf: text/plain[/code]dlaczego mimetype zadziałało na pliku, do którego nie mam prawa odczytu?
Bo mimetype działa - wg "mana" - na "Shared MIME-info database" (man mimetype, man update-mime-database).

Nie zgłębiam tematu, ale pewnie działa podobnie jak polecenie "locate", które odpalisz jako zwykły user i "updatedb", które może uruchomić tylko root. Do odczytu bazy ma dostęp każdy, do indeksowania root.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...