在使用Python的write方法的文件开头使用此代码时出现意外的间距?

2024-04-29 02:07:26 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,如果标题没有意义的话,我的标题很差

合理的代码从if argv[2] == pram[2]:行开始

Code:

from Crypto.Cipher import AES
from base64 import b64encode, b64decode

KEY = 'G$xUHGGPF#abfg&9'


class Crypt:
    def __init__(self, salt='SlTKeYOpHygTYkP3'):
        self.salt = salt
        self.enc_dec_method = 'utf-8'

    def encrypt(self, str_to_enc, str_key):
        try:
            aes_obj = AES.new(str_key, AES.MODE_CFB, self.salt)
            hx_enc = aes_obj.encrypt(str_to_enc)
            mret = b64encode(hx_enc).decode(self.enc_dec_method)
            return mret
        except:
            pass

    def decrypt(self, enc_str, str_key):
        try:
            aes_obj = AES.new(str_key, AES.MODE_CFB, self.salt)
            str_tmp = b64decode(enc_str.encode(self.enc_dec_method))
            str_dec = aes_obj.decrypt(str_tmp)
            mret = str_dec.decode(self.enc_dec_method)
            return mret
        except:
            pass


if __name__ == '__main__':
    from sys import argv, exit
    from pathlib import Path

    crypt = Crypt()
    pram = ["-e", "-d", "-ef", "-df"]
    try:
        if len(argv[1:]) > 2 or len(argv[1:]) == 0 or (len(argv) == 3 and not (argv[1] in pram[2:])):
            raise Exception
        if argv[1] not in pram:
            raise Exception
        if (argv[1] in pram[2:]) and len(argv[1:]) == 1:
            raise Exception
        elif argv[1] in pram[2:]:
            if not Path(argv[2]).is_file():
                raise FileNotFoundError

        if argv[1] == pram[0]:
            print(crypt.encrypt(str(input('ENCRYPT> ')), KEY))
        if argv[1] == pram[1]:
            print(crypt.decrypt(str(input('DECRYPT> ')), KEY))
        ##########
        #FROM HERE
        ##########
        if argv[1] == pram[2]:
            try:
                with open(argv[2], 'r+', encoding='utf-8') as f:
                    for_test=f.readlines()
                    print([_.replace('\n','') for _ in for_test])
                    enc = [crypt.encrypt(_.replace('\n',''), KEY)+'\n' for _ in for_test]
                    enc[-1] = enc[-1].rstrip('\n')
                    f.truncate(0)
                    for _ in range(len(enc)):
                        f.write(enc[_])
                    print(enc)
                if enc != None:
                    print(f'{argv[2]} is now encrypted.')
            except:
                raise
        if argv[1] == pram[3]:
            try:
                with open(argv[2], 'r+', encoding='utf-8') as f:
                    enc = [crypt.decrypt(_.replace('\n',''), KEY)+'\n' for _ in f.readlines()]
                    enc[-1] = enc[-1].rstrip('\n')
                    if any([True for _ in enc if _ is None]):
                        print('Failed to Decrypt!')
                        exit(0)
                    f.truncate(0)
                    for _ in range(len(enc)):
                        f.write(enc[_])
                    print(enc)
                if enc != None:
                    print(f'{argv[2]} is now decrypted.')
            except:
                print('Failed to Decrypt!')
        ##########
        #TILL HERE
        ##########
    except FileNotFoundError:
        print('No such file or directory exists')
    except Exception as e:
        print("""Improper parameters provided:
        -e; -d; -ef <file>; -df <file>""")

每次我用-xf参数运行上面的脚本时,它都会对文件进行加密和解密,但会不断在文件的第一行添加空格或一些不可见的字符, 以下供参考-

Let the file be test.txt with these 3 lines-
#Before using the script, In notepad:
sagar
manish
deepak
####################################

$ D:\> python .\crypt.py -ef .\test.txt
['sagar', 'manish', 'deepak']
['JLGSPlA=\n', 'OkR3fipr\n', 'M+wzlave']
.\test.txt is now encrypted.

#Now, In Notepad:
                     JLGSPlA=
OkR3fipr
M+wzlave
####################################

D:\> python .\crypt.py -df .\test.txt
['sagar\n', 'manish\n', 'deepak']
.\test.txt is now decrypted.

#Now, In Notepad:
                                                 sagar
manish
deepak
####################################

D:\> python .\crypt.py -ef .\test.txt
['\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00sagar', 'manish', 'deepak']
['V6cCTqkeReagrMBO1ygXclSKS4O16BF1pjWetDNEiwth/wY5f/Hj7UPew8bJKPLNInFsDIVn\n', 'OkR3fipr\n', 'M+wzlave']
.\test.txt is now encrypted.

#Now, In Notepad:
                                                                      V6cCTqkeReagrMBO1ygXclSKS4O16BF1pjWetDNEiwth/wY5f/Hj7UPew8bJKPLNInFsDIVn
OkR3fipr
M+wzlave
####################################

D:\> python .\crypt.py -df .\test.txt
['\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00sagar\n', 'manish\n', 'deepak']
.\test.txt is now decrypted.

#In Notepad
                                                                                                                                                                                                                   sagar
manish
deepak
####################################

为什么会这样,这是我第一次经历这样的事情。任何帮助都将不胜感激


Tags: intestselftxtforifisprint