【问题标题】:Read the value from a file with Python使用 Python 从文件中读取值
【发布时间】:2019-11-07 15:59:47
【问题描述】:

我的文件内容:

NAME="A"
VERSION="20190515231057-816a"
VERSION_ID="2.0"
BUILD_ID="16a438d965923ab62804cea4ba00"
BUILDER_NAME="v1.0"
BUILDER_VERSION="v1.0"

我需要读取任何数据值,例如BUILDER_VERSION 是值(v1.0)。我尝试了以下代码,但是由于特殊字符而导致错误。我该如何解决这个问题或请提出不同的命令?

build_value = subprocess.check_output("sed -ne 's/BUILDER_VERSION=\([^]*\).*/\1/p' < /etc/os-release", shell=True)

【问题讨论】:

    标签: python sed subprocess


    【解决方案1】:

    将 sed 命令替换为:

    sed -n 's/^BUILDER_VERSION*= *//p' < /etc/os-release
    

    您可以将 BUILDER_VERSION 替换为所需的模式

    【讨论】:

      【解决方案2】:

      你可以试试这样的:

      with open(FILE_NAME, 'r') as file:
          parsed = file.read().split('\n')
          for item in parsed:
              if VAR_NAME in item:
                  print(item)
      

      这将打印包含变量名的文件的整行。您还可以将该行保存为字符串文字,并通过切片、拆分、正则表达式等进一步分解。

      不过,我确信有更简洁的方法可以做到这一点,所以我会查看一些有关读取文件的 Python 文档!

      【讨论】:

        【解决方案3】:

        在 python 中,您可以避免在这种简单的情况下使用子进程。您可以使用 open() 直接读取文件或接受来自sys.stdin 的“标准输入”(在此之前您需要导入 sys)。

        import sys
        for line in sys.stdin:
            if line.startswith('BUILDER_VERSION='):
                  value = line.split('=', 1)
                  print(value[1] if value or 'No version')
                  break
         else:
              print('version is not found')
        

        你可以像 sed 一样使用它:cat /etc/os-release|python this_script.py

        如果要提取数字,可以使用相同的正则表达式:

        import re
        version_extractor = re.compile(r'BUILDER_VERSION=([^^]*)')
        
        with open('/etc/os-release', 'r') as file:
           for line in file:
               match = version_extractor.match(line)
               if match:
                   print(match.groups()[0])
        

        【讨论】:

        • @lok​​esh-chandak 嗨,感谢您修复格式。但是我将您的 1 更改恢复为“else”子句。这样,如果没有找到匹配项,代码只会在流的末尾打印一次“未找到版本”。
        【解决方案4】:

        我更改了sed -n 's/^BUILDER_VERSION*= *//p' &lt; /etc/os-release 命令。现在工作正常。我还在 v1.0 的子进程命令的末尾添加了 .replace('"', '')。 谢谢大家。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-22
          • 2019-04-26
          • 2023-03-30
          • 2014-12-10
          • 1970-01-01
          • 2019-03-09
          • 1970-01-01
          • 2013-08-02
          相关资源
          最近更新 更多