Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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_Configparser - Fatal编程技术网

Python 如何从配置文件中删除白色字符?

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

我想使用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 ):
        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,我认为这是因为这种方法不允许在my
stripfile
中传递
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!