Python 如何从配置文件中删除白色字符?
我想使用python修改samba配置文件。 这是我的密码Python 如何从配置文件中删除白色字符?,python,configparser,Python,Configparser,我想使用python修改samba配置文件。 这是我的密码 from ConfigParser import SafeConfigParser parser = SafeConfigParser() parser.read( '/etc/samba/smb.conf' ) for section in parser.sections(): print section for name, value in parser.items( section ): prin
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.read( '/etc/samba/smb.conf' )
for section in parser.sections():
print section
for name, value in parser.items( section ):
print ' %s = %r' % ( name, value )
但是配置文件包含选项卡,是否有可能忽略这些选项卡
ConfigParser.ParsingError: File contains parsing errors: /etc/samba/smb.conf
[line 38]: '\tworkgroup = WORKGROUP\n'
试试这个:
from StringIO import StringIO
data = StringIO('\n'.join(line.strip() for line in open('/etc/samba/smb.conf')))
parser = SafeConfigParser()
parser.readfp(data)
...
另一种方式(感谢@mgilson的创意):
我将创建一个小的代理类来为解析器提供信息:
class FileStripper(object):
def __init__(self,f):
self.fileobj = open(f)
self.data = ( x.strip() for x in self.fileobj )
def readline(self):
return next(self.data)
def close(self):
self.fileobj.close()
parser = SafeConfigParser()
f = FileStripper(yourconfigfile)
parser.readfp(f)
f.close()
您甚至可以做得更好一点(允许多个文件,完成后自动关闭它们,等等):
它可以这样使用:
parser = SafeConfigParser()
parser.readfp( FileStripper(yourconfigfile1,yourconfigfile2) )
#parser.readfp( FileStripper(yourconfigfile) ) #this would work too
#No need to close anything :). Horray Context managers!
您可以
.strip()
字符串,这也将删除选项卡。如果您将readline
作为生成器(使用yield
),则不必将整个文件加载到self.data
@MikeDeSimone--我将self.data
作为生成器,因此我不会读取整个文件。@Mike DeSimone:不会self.data
是一个生成器。@MikeDeSimone——真的,因为这些都是配置文件,它们不太可能大到足以产生影响,而defuz的答案可能更容易实现。我只是想展示一种方法,不用一次读取整个文件。我也想过从文件
继承,但我总是犹豫不决,因为文档说你应该使用打开
来构造文件
对象,但我一直不太明白为什么。@mgilson,我认为这是因为这种方法不允许在mystripfile
中传递StringIO
或其他类似文件的对象。如果您的类构造函数使用的是文件,而不是文件名,那么这是可能的,而且非常好。但对于日常工作来说,这并不是什么大不了的事。
class FileStripper(object):
def __init__(self,*fnames):
def _line_yielder(filenames):
for fname in filenames:
with open(fname) as f:
for line in f:
yield line.strip()
self.data = _line_yielder(fnames)
def readline(self):
return next(self.data)
parser = SafeConfigParser()
parser.readfp( FileStripper(yourconfigfile1,yourconfigfile2) )
#parser.readfp( FileStripper(yourconfigfile) ) #this would work too
#No need to close anything :). Horray Context managers!