繁体   English   中英

从python中的.ini文件读取特殊字符文本

[英]reading special characters text from .ini file in python

我正在运行一个脚本,该脚本采用文本“rAh%19u^l\\&G”,即包含所见的特殊字符。

当我在脚本中将此文本作为参数传递时,它运行良好,没有任何错误。

示例 - : ./abc.py <username><pwd>

上面的文字基本上就是一个密码。

现在,当我将我的值放入配置文件并阅读上述文本时,脚本失败了

*******abc.ini *******

[DEFAULT]
username = rahul
pwd =  rAh%19u^l\&G

它说

/bin/sh:M command not found.

在配置解析器的帮助下读取上述值

******下面是程序abc.py ******

#! /usr/bin/python

parser = configparser.ConfigParser()
parser.read('abc.ini')
username = parser.get('DEFAULT','username')
pwd = parser.get('DEFAULT','pwd')


p = subprocess.Popen(
    "abc.py {0} {1}" .format(username, pwd), 
    shell=True, 
    stdout=subprocess.PIPE
)

out, err = p.communicate()

print(out)

我尝试了很多搜索,但没有找到具体的内容。

所以问题是如何读取 .ini 文件中包含特殊字符的文本。

看起来%字符是这里的问题。 如果您使用的是ConfigParser它具有特殊意义。 如果您不使用插值, RawConfigParser使用RawConfigParser ,否则您必须通过加倍来转义%

当我使用ConfigParser尝试示例文件时,它会出现以下异常:

InterpolationSyntaxError: '%' must be followed by '%' or '(', found: '%19u^l\\&G"'

如果我取代ConfigParserRawConfigParser一切都很好。

您发布的错误与此无关。 我们甚至无法判断它是 python 异常还是 shell 错误消息。 请使用完整的错误消息更新您的问题。 您还可能要检查的sh模块,围绕更高层次的包装subprocess

加上 Paulo Scardine 的评论。

如果您有需要处理的特殊字符,您可以将ConfigParserinterpolation参数设置为None并且您将不再有错误。 默认情况下, ConfigParserinterpolation设置为BasicInterpolation()

您可以在此处阅读更多相关信息: https : //docs.python.org/3.6/library/configparser.html#interpolation-of-values

此外,根据文档RawConfigParserRawConfigParserLegacy variant of the ConfigParser with interpolation disabled by default and unsafe add_section and set methods.

这是那里的一个片段:

例子:

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

在上面的示例中,插值设置为 BasicInterpolation() 的 ConfigParser 会将%(home_dir)s解析为home_dir的值(在本例中为 /Users)。 %(my_dir)s实际上会解析为/Users/lumberjack [....]

将插值设置为None ,解析器将简单地返回%(my_dir)s/Pictures作为my_pictures的值和%(home_dir)s/lumberjack作为my_dir的值。

您可以使用相同的字符转义特殊字符。 例如,为了能够读取 % 你必须写它 %%

我遇到过同样的问题。 可以理解,答案已经发布。 使用这篇文章中每个人的评论,我已经通过以下方式解决了这个问题:

我的密码是Sgf%ts54hhGtrf&yhgf

我使用的sqlalchemy.url = driver://myuser:Sgf%ts54hhGtrf&yhgf@localhost/my_application ini 文件sqlalchemy.url = driver://myuser:Sgf%ts54hhGtrf&yhgf@localhost/my_application

收到错误: configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(',它告诉我特殊字符是 '%'

解决了这个问题,只需将密码用单引号括起来,然后按照本文评论中的建议将 % 符号加倍,最终得到:

sqlalchemy.url = driver://myuser:'Sgf%%ts54hhGtrf&yhgf'@localhost/my_application

无需担心更改ConfigParser ,只要您坚持使用单引号将包含特殊字符的密码和在您收到的错误中发现的任何特殊字符加倍的规则,例如如果错误与%相关,添加另一个并以%%结束

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM