Python将解析器元素配置为CSV参数

Python将解析器元素配置为CSV参数,python,csv,tabs,configparser,Python,Csv,Tabs,Configparser,我有一个脚本,可以解析csv文件并生成XML文件。我必须给解析器的一个参数是分隔符,在我的例子中,分隔符不是逗号,而是制表符 该信息存储在一个配置文件中,我提取该文件,然后将其传递给csv解析器 ident = parser.get('CSV', 'delimiter') #delimiter taken from config file csv.register_dialect('custom', delimiter= ident, #passed

我有一个脚本,可以解析csv文件并生成XML文件。我必须给解析器的一个参数是分隔符,在我的例子中,分隔符不是逗号,而是制表符

该信息存储在一个配置文件中,我提取该文件,然后将其传递给csv解析器

ident = parser.get('CSV', 'delimiter') #delimiter taken from config file 

csv.register_dialect('custom', 
                    delimiter= ident, #passed to csv parser
                    doublequote=False,
                    escapechar=None,
                    quotechar='"',
                    quoting=csv.QUOTE_MINIMAL,
                    skipinitialspace=False)

但是,我得到一个类型错误,表示“分隔符”必须是一个1个字符的字符串。我检查了ident的类型,它是一个字符串,但它似乎没有将\t识别为选项卡。当我输入ident='\t'或delimiter='\t'时,它会工作。如何从配置文件中正确获取值。

这似乎不可能使用。 虽然文档没有明确提到这种情况,但他们确实说前导空格将从值中删除

在尝试往返该值后,它只返回一个空字符串:

from ConfigParser import ConfigParser
cp = ConfigParser()
cp.add_section('a')
cp.set('a', 'b', '\t')
cp.write(open('foo.ini', 'w'))

cp_in = ConfigParser()
cp_in.read('foo.ini')
print(repr(cp_in.get('a', 'b'))) # prints ''

这似乎不可能使用。 虽然文档没有明确提到这种情况,但他们确实说前导空格将从值中删除

在尝试往返该值后,它只返回一个空字符串:

from ConfigParser import ConfigParser
cp = ConfigParser()
cp.add_section('a')
cp.set('a', 'b', '\t')
cp.write(open('foo.ini', 'w'))

cp_in = ConfigParser()
cp_in.read('foo.ini')
print(repr(cp_in.get('a', 'b'))) # prints ''

也许有点晚了,但我有一个小的解决方法:将参数设置为十六进制代码值,然后对其进行解码

from ConfigParser import ConfigParser
cp = ConfigParser()
cp.add_section('a')
cp.set('a', 'b', '09') #hex code for tab (please note that there is no \x
cp.write(open('foo.ini', 'w'))

from ConfigParser import ConfigParser
cp_in = ConfigParser()
cp_in.read('foo.ini')
print(repr(bytearray.fromhex(cp_in.get('a', 'b')).decode())) #where the magic happens

也许有点晚了,但我有一个小的解决方法:将参数设置为十六进制代码值,然后对其进行解码

from ConfigParser import ConfigParser
cp = ConfigParser()
cp.add_section('a')
cp.set('a', 'b', '09') #hex code for tab (please note that there is no \x
cp.write(open('foo.ini', 'w'))

from ConfigParser import ConfigParser
cp_in = ConfigParser()
cp_in.read('foo.ini')
print(repr(bytearray.fromhex(cp_in.get('a', 'b')).decode())) #where the magic happens

什么是len(ident)和repr(ident)?配置文件中的分隔符周围是否有空格?也许您需要使用strip()?“打印标识”显示什么?len(ident)是2,repr(ident)是“\\t”确定
repr(ident)
不是
“\\t”
?如果printing ident显示的是
\t
而不仅仅是空白,那么
parser.get
会给您带来一些错误。也许可以尝试
delimiter=eval(ident)
?没有报告(ident)是“\\t”,两个\\都是红色的,但打印标识只会\t。我还尝试了eval,但它抛出了一个语法错误,即t字符:行连续字符后的意外字符len(ident)和repr(ident)是什么?配置文件中的分隔符周围是否有空格?也许您需要使用strip()?“打印标识”显示什么?len(ident)是2,repr(ident)是“\\t”确定
repr(ident)
不是
“\\t”
?如果printing ident显示的是
\t
而不仅仅是空白,那么
parser.get
会给您带来一些错误。也许可以尝试
delimiter=eval(ident)
?没有报告(ident)是“\\t”,两个\\都是红色的,但打印标识只会\t。我还尝试了eval,但它抛出了一个语法错误,为t char:unexpected character after line continuation character