Otwieranie pliku w odpowiednim kodowaniu

0

Próbuję zrobić Konsolowy menadżer plików ale wyskakuje mi error:

Traceback (most recent call last):
  File "C:\Users\Tomasz\Desktop\Programowanie\Pynux123.py", line 11, in <module>
    print(f.read())
          ^^^^^^^^
  File "C:\Program Files\Python312-32\Lib\encodings\cp1250.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 116: character maps to <undefined>```

Kod:

Default_Dir = r"C:\Users\Tomasz"
Default_Cmd = Default_Dir + ">"

while True:
    Cmd = input(Default_Cmd)
    if Cmd.startswith("open "):
        Command = Cmd.replace('open ', '', 1)
        print(Default_Dir + "\\" + Command)
        try:
            f = open(Default_Dir + "\\" + Command, "r")
            print(f.read())
        except OSError:
            print("OPENING FILE FAILED")
        

Może ktoś pomóc?

0

Jak wygląda ta ścieżka? Na pewno jest prawidłowa?

0
PolskaGra napisał(a):

Próbuję zrobić Konsolowy menadżer plików ale wyskakuje mi error:

Traceback (most recent call last):
  File "C:\Users\Tomasz\Desktop\Programowanie\Pynux123.py", line 11, in <module>
    print(f.read())
          ^^^^^^^^
  File "C:\Program Files\Python312-32\Lib\encodings\cp1250.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 116: character maps to <undefined>```

Próbujesz go otworzyć w nieodpowiednim kodowaniu.

0
Riddle napisał(a):

Próbujesz go otworzyć w nieodpowiednim kodowaniu.

Czyli?

1
PolskaGra napisał(a):
Riddle napisał(a):

Próbujesz go otworzyć w nieodpowiednim kodowaniu.

Czyli?

Czyli plik zawiera treść w jednym kodowaniu, a podczas otwierania python próbuje go otworzyć tak jakby był w innym. Dochodzi do sytuacji w której kodowanie się nie zgadza, i dlatego masz wyjątek.

0
Riddle napisał(a):
PolskaGra napisał(a):
Riddle napisał(a):

Próbujesz go otworzyć w nieodpowiednim kodowaniu.

Czyli?

Czyli plik zawiera treść w jednym kodowaniu, a podczas otwierania python próbuje go otworzyć tak jakby był w innym. Dochodzi do sytuacji w której kodowanie się nie zgadza, i dlatego masz wyjątek.

Ale Jak to Naprawić?

0
PolskaGra napisał(a):

Ale Jak to Naprawić?

Albo odczytać plik w kodowaniu w takim jest zapisany, albo zmienić kodowanie pliku na takie w jakim Twój kod próbuje go odczytać.

Jeśli chcesz pomocy to wrzuć plik w .zip oraz cały kod aplikacji.

0

Dobry wstępniak do używania libki CMD:
http://pymotw.com/2/cmd/

0

możesz wykorzystać moduł charset_normalizer (pip install charset_normalizer), otworzyć i wczytać plik w trybie binarnym rb a następnie poddać go detekcji pod względem kodowania. Poniżej przykład dla pliku stworzonego w Notepad i zapisanego jako UTF8 with BOM:

┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│00000000│ ef bb bf 53 69 61 c5 82 ┊ 61 20 62 61 62 61 20 6d │×××Sia××┊a baba m│
│00000010│ 61 6b 2c 20 7a 61 c5 bc ┊ c3 b3 c5 82 c4 87 20 67 │ak, za××┊×××××× g│
│00000020│ c4 99 c5 9b 6c c4 85 20 ┊ 6a 61 c5 ba c5 84 0d 0a │××××l×× ┊ja××××__│
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
PS C:\dev> ipython
In [1]: import charset_normalizer as ch
In [2]: data = open('b.txt', 'rb').read()
In [3]: data
Out[3]: b'\xef\xbb\xbfSia\xc5\x82a baba mak, za\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87 g\xc4\x99\xc5\x9bl\xc4\x85 ja\xc5\xba\xc5\x84\r\n'
In [4]: ch.detect(data)
Out[4]: {'encoding': 'UTF-8-SIG', 'language': '', 'confidence': 1.0}
In [5]: data.decode('UTF-8-SIG')
Out[5]: 'Siała baba mak, zażółć gęślą jaźń\r\n'

wraz z modułem instaluje się również program cli o nazwie normalizer, który w terminalu pozwala wykryć kodowanie plików.

więcej info znajdziesz na stronie z dokumentacją do tego modułu, ale ogólnie to wczytywanie jest z nim banalne:

from charset_normalizer import from_path
zawartosc_pliku = str(from_path('plik.txt').best())
print(zawartosc_pliku)

1 użytkowników online, w tym zalogowanych: 0, gości: 1