1 Востаннє редагувалося Eff1c (07.01.2019 18:18:44)

Тема: робота з файлами

Побачив (ось тут - https://pythonworld.ru/tipy-dannyx-v-py … jlami.html Вибачайте за рос), що є такий режим відкривання файлу, як "+". Спробував ним скористатися, але компілятор вибив помилку.
Код:

my_file = open(r'C:/Users/xxxl/Desktop/eff1c.txt', '+')
print(my_file.read())
my_file.write('eff1c nice')
my_file.close()

Помилка:

Traceback (most recent call last):
  File "D:/d/illya/practice/practice/practic_x_1.py", line 1, in <module>
    my_file = open(r'C:/Users/xxxl/Desktop/eff1c.txt', '+')
ValueError: Must have exactly one of create/read/write/append mode and at most one plus

Користуюсь PyCharm.
І чи можливо ще якось поєднувати режими відкриття (цікавить w i r)? Чи обов'язково спочатку відкривати файл, його читати, закривати і тоді знову відкривати, писати і знову закривати?

Ще цікаві всякі допоміжні засоби, цікаві штучки, методи, чи щось типу того, роботи з файлами (такі як оператор "with", наприклад).

2

Re: робота з файлами

'+' - це додаток до основного режиму. Тобто можна робити 'r+', 'w+' і т.д. - тоді відкриється так само, як і з 'r' чи 'w', але додатково можна буде ще писати/читати.

Подякували: Eff1c1

3

Re: робота з файлами

Ще цікаві всякі допоміжні засоби, цікаві штучки, методи, чи щось типу того, роботи з файлами (такі як оператор "with", наприклад).

це не оператор.
Python Operator falls into 7 categories:

    Python Arithmetic Operator
    Python Relational Operator
    Python Assignment Operator
    Python Logical Operator
    Python Membership Operator
    Python Identity Operator
    Python Bitwise Operator

Подякували: leofun01, koala, Eff1c3

4

Re: робота з файлами

ping написав:

це не оператор.

Дякую, буду знати.
Просто читав ось цю статтю https://python-scripts.com/work-with-files-python і тут його назвали оператором.

5

Re: робота з файлами

Чомусь не працює "ab+", "wb+" i "ab".
Працює тільки така версія програми:

from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
l = f.encrypt(bytes(input(), encoding="UTF-8"))   #ввожу строку, зразу перетворюю в байти і шифрую
file = open("C:/Users/xxxl/Desktop/eff1c.txt", 'wb')  #!!!
file.write(l)
file.close()
file = open("C:/Users/xxxl/Desktop/eff1c.txt", 'rb')
print(f.decrypt(file.read()).decode("UTF-8"))     #вивожу на екран все що в документі
file.close()                                      #при цьому спочатку розшифровую і тоді з байтів перевожу в стрічку

Як тільки міняю значення в рядку з коментом "!!!" на один з трьох вищеперечислених - вибиває помилку (коли підставляю "wb+" чи "ab+" - перероблюю трохи код. Не відкриваю вдруге для читання, а все зразу (думаю ви і самі знаєте)).
Звісно, я можу зробити замість append-у - прочитати, зберегти в змінну, додати до змінної те, що мав додавати і тоді все разом записати, але вийде нечитабельно і не практично.
P's. Просто розроблюю програму, яка буде брати пароль, шифрувати і зберігати в зазначеному документі, а потім при потребі буде його виводити і розшифровувати.

6

Re: робота з файлами

Eff1c написав:

вибиває помилку

Та що ви таке кажете! Ну, сподіваюся, якийсь телепат вже прочитав, яку саме, і телепатично дав вам відповідь. Бо інакше ніяк.

Подякували: Eff1c1

7

Re: робота з файлами

Вибачте, затупив  *SCRATCH*
При "ab":

Traceback (most recent call last):
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\fernet.py", line 106, in _verify_signature
    h.verify(data[-32:])
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\hazmat\primitives\hmac.py", line 69, in verify
    ctx.verify(signature)
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\hazmat\backends\openssl\hmac.py", line 73, in verify
    raise InvalidSignature("Signature did not match digest.")
cryptography.exceptions.InvalidSignature: Signature did not match digest.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/d/illya/practice/practice/practic_x_1.py", line 22, in <module>
    print(f.decrypt(file.read()).decode("UTF-8"))     #вивожу на екран все що в документі
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\fernet.py", line 75, in decrypt
    return self._decrypt_data(data, timestamp, ttl)
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\fernet.py", line 119, in _decrypt_data
    self._verify_signature(data)
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\fernet.py", line 108, in _verify_signature
    raise InvalidToken
cryptography.fernet.InvalidToken

При "ab+" i "wb+" (помилка та ж сама):

Traceback (most recent call last):
  File "D:/d/illya/practice/practice/practic_x_1.py", line 20, in <module>
    print(f.decrypt(file.read()).decode("UTF-8"))
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\fernet.py", line 74, in decrypt
    timestamp, data = Fernet._get_unverified_token_data(token)
  File "C:\Users\xxxl\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\fernet.py", line 94, in _get_unverified_token_data
    raise InvalidToken
cryptography.fernet.InvalidToken

Як ввід завжди вказував "Eff1c".
Ось як виглядає прога з "wb+" чи "ab+":

from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
l = f.encrypt(bytes(input(), encoding="UTF-8"))   
file = open("C:/Users/xxxl/Desktop/eff1c.txt", 'wb+')  #міняється тільки значення 'wb+' на 'ab+'
file.write(l)
print(f.decrypt(file.read()).decode("UTF-8"))
file.close()
Подякували: leofun011

8

Re: робота з файлами

А ви порівнювали вміст файлів у різних варіантах? Уважно прочитайте табличку за першим вашим посиланням.

Подякували: leofun011

9 Востаннє редагувалося Eff1c (09.01.2019 23:07:19)

Re: робота з файлами

koala написав:

А ви порівнювали вміст файлів у різних варіантах? Уважно прочитайте табличку за першим вашим посиланням.

Перед використанням append-у чистив повністю документ.
А при "w" - воно повинне саме очищувати і тоді записувати.

10

Re: робота з файлами

А ви файл, коли "a" використовуєте, на початок переставляєте?

11

Re: робота з файлами

koala написав:

А ви файл, коли "a" використовуєте, на початок переставляєте?

Тобто переставляю? Я його чищу, перед тим як запускати код з "а".

12

Re: робота з файлами

Ви знову розраховуєте на телепатів? Як саме ви його чистите?
Ну і ніколи не пишіть "думаю ви і самі знаєте". Ніхто на форумі не знає, що у вас у голові відбувається.

13

Re: робота з файлами

koala написав:

Як саме ви його чистите?

Заходжу в нього, CTRL+A, BACK SPACE, CTRL+S.

koala написав:

Ну і ніколи не пишіть "думаю ви і самі знаєте". Ніхто на форумі не знає, що у вас у голові відбувається.

Буду знати.
Та я думаю, що не проблема в тому, що я його погано чищу, бо "wb+" від цього не залежить і видає помилку. Помилка така ж сама і в "ab+", тому я думаю, що проблема не в цьому.

14 Востаннє редагувалося leofun01 (10.01.2019 08:50:21)

Re: робота з файлами

У вас при кожному запуску програми генерується новий ключ (key = Fernet.generate_key()), з використанням якого виконується шифрування.
Розшифровувати стрічки потрібно з тим ключом, з яким ця стрічка була зашифрована.
Як варіант, можете зберігати ключі в тому ж файлі. Не рекомендую так робити, але поки ви вчитеся, можна і так.

from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
str = input()
# input
file_name = '1.txt'
enc = 'UTF-8'
line_separator = b'\r\n'

line = key + b' ' + f.encrypt(bytes(str, encoding = enc))
line += line_separator

with open(file_name, 'ab+') as file:
    file.write(line)

with open(file_name, 'rb') as file:
    for line in file:
        key, str = line.strip().split(b' ', 2)
        f = Fernet(key)
        str = f.decrypt(str.strip(), ttl = None)
        print(str.decode(enc))

Ця програма при кожному запуску додає у файл +1 зашифрований рядок і виводить всі розшифровані рядки.

Подякували: Eff1c1

15

Re: робота з файлами

Так, ви мене таки змусили проглянути свої кацапомовні посилання, і, звісно, там немає і половини того, що є на https://uk.wikibooks.org/wiki/Пориньте_у_Python_3/Файли.
Для розуміння: концепція файлу розроблялася для роботи з плівкою в касеті. З плівки можна читати лише в одному місці, щоб читати інше місце - плівку треба прокрутити. Стандартні операції читання та запису автоматично прокручують плівку на стільки, скільки вони прочитали/записали.

Подякували: Eff1c, leofun012

16

Re: робота з файлами

koala написав:

Так, ви мене таки змусили проглянути свої кацапомовні посилання, і, звісно, там немає і половини того, що є на https://uk.wikibooks.org/wiki/Пориньте_у_Python_3/Файли.
Для розуміння: концепція файлу розроблялася для роботи з плівкою в касеті. З плівки можна читати лише в одному місці, щоб читати інше місце - плівку треба прокрутити. Стандартні операції читання та запису автоматично прокручують плівку на стільки, скільки вони прочитали/записали.

Я так зрозумів помилка у мене була ізза того, що я не повертав каретку.
Дякую