Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python在覆盖文件时在文件开头添加不必要的字符?_Python_Regex_Django_Python 3.x - Fatal编程技术网

为什么Python在覆盖文件时在文件开头添加不必要的字符?

为什么Python在覆盖文件时在文件开头添加不必要的字符?,python,regex,django,python-3.x,Python,Regex,Django,Python 3.x,在一个Django项目中,我创建了一个.env文件来存储我的应用程序的秘密凭证。我正在使用console命令生成一些凭证。这是我的初始.env文件 SECRET_KEY=CHANGE_IT DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=database_name DB_USERNAME=database_username DB_PASSWORD=database_password DB_SCHEMA=database

在一个
Django
项目中,我创建了一个
.env
文件来存储我的应用程序的秘密凭证。我正在使用console命令生成一些凭证。这是我的初始
.env
文件

SECRET_KEY=CHANGE_IT
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=database_name
DB_USERNAME=database_username
DB_PASSWORD=database_password
DB_SCHEMA=database_schema_name
这是我的
generate_secret
console命令,用随机字符串覆盖
secret_密钥

import re
import os

from django.core.management import BaseCommand
from django.core.management.utils import get_random_secret_key


class Command(BaseCommand):
    help = ''

    def handle(self, *args, **options):
        env_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../.env'))

        self.set_secret_key(env_path, get_random_secret_key())

    @staticmethod
    def set_secret_key(env_file_path, secret_key):
        fp = open(env_file_path, 'r+')

        current_env = fp.read()
        regex = r"(SECRET_KEY=.*?)\n"

        matches = re.findall(regex, current_env, re.MULTILINE)

        updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

        fp.truncate(0)
        fp.write(updated_env)

        fp.close()
问题是,当我运行该命令时,它会正确地覆盖
密钥
,但也会在
.env
文件的开头添加一些有线字符。我运行的是
ubuntu18.04
操作系统。这是运行命令后的
.env
文件


我不知道为什么,但我无法复制这些有线字符,因此我附上了它的屏幕截图。

不知道为什么,但
fp.truncate(0)
似乎是罪魁祸首(有关更多信息,请参阅)

就我个人而言,我会分两步来做:首先读取文件,然后重写它

@staticmethod
def set_secret_key(env_file_path, secret_key):
    with open(env_file_path, 'r') as fp:
        current_env = fp.read()

    regex = r"(SECRET_KEY=.*?)\n"
    matches = re.findall(regex, current_env, re.MULTILINE)
    updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

    with open(env_file_path, 'w')as fp:
        fp.write(updated_env)
如果要一步完成,请按照建议在
fp.truncate()之前使用
fp.seek(0)

@staticmethod
def set_secret_key(env_file_path, secret_key):
    fp = open(env_file_path, 'r+')

    current_env = fp.read()
    regex = r"(SECRET_KEY=.*?)\n"

    matches = re.findall(regex, current_env, re.MULTILINE)

    updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

    fp.seek(0)
    fp.truncate()
    fp.write(updated_env)

    fp.close()

不确定原因,但
fp.truncate(0)
似乎是罪魁祸首(有关更多信息,请参阅)

就我个人而言,我会分两步来做:首先读取文件,然后重写它

@staticmethod
def set_secret_key(env_file_path, secret_key):
    with open(env_file_path, 'r') as fp:
        current_env = fp.read()

    regex = r"(SECRET_KEY=.*?)\n"
    matches = re.findall(regex, current_env, re.MULTILINE)
    updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

    with open(env_file_path, 'w')as fp:
        fp.write(updated_env)
如果要一步完成,请按照建议在
fp.truncate()之前使用
fp.seek(0)

@staticmethod
def set_secret_key(env_file_path, secret_key):
    fp = open(env_file_path, 'r+')

    current_env = fp.read()
    regex = r"(SECRET_KEY=.*?)\n"

    matches = re.findall(regex, current_env, re.MULTILINE)

    updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

    fp.seek(0)
    fp.truncate()
    fp.write(updated_env)

    fp.close()

仅供参考:
r”(SECRET\u KEY=.*?\n“
可以写成
r”SECRET\u KEY=.*”
re.MULTILINE
是不必要的。很酷,谢谢,但是你能发现一些问题吗?仅供参考:
r“(SECRET\u KEY=.*?)\n“
可以写成
r“SECRET\u KEY=.*”
<代码>关于多行
是不必要的。很酷,谢谢,但是你能发现一些问题吗?