我有一个文件由许多固定宽度格式的文本组成。每行可以使用各种宽度和格式的单词和数字的组合。我希望能够在修改一些单词和数字后重写文件。我正计划使用Python函数string.format()
来实现这一目标。但是,要做到这一点,我需要为每一行恢复格式规范(这里描述)。
我查看了使用完整的解析器包,例如这里描述的包,但我认为这可能有点过分。我还研究了每行中每个字符的迭代并检查它是什么类型,但结果却非常缓慢而笨重。
我试图放在一起的功能看起来像这样:
def get_format_spec(line):
'''reads a line (<class 'str'>) and returns the format specification
(also <class 'str'>) used by str.format().
'''
--> PROCESS LINE <--
return format_spec
目标是使功能执行如下:
line = " 1 1.00E+07 autv 5 1000 1.00E-01 -1.00E+00 0 0"
format_spec = get_format_spec(line)
print(format_spec)
>> "{:>10d}{:>10.2E}{:>5}{:>5d}{:>5d}{:>10.2E}{:>10.2E}{:>5d}{:>5d}"
发布于 2019-04-17 10:32:26
这通常是不可能的,因为有多种格式可以产生任何给定的输出文本。您描述的语义要求您定义输出语言的语法,以便您可以正确地将输入解析为一系列词法标记。然后可以使用格式规范单独描述这些令牌。
如果没有这种语法,退化情况就是微不足道的:每一行都是一个共同长度的字符串。因此,不需要重新格式化。
OP评论后更新
如果字符串唯一地解析为这些令牌,是的,问题是易处理的。考虑到你的一个例子,我希望它易于处理:你有整数,E
格式的实数和字母串,整齐地用空格分隔。
我看到四种令牌类型:
这是一个非常简单的语法; 无论您选择何种解析工具,都可以在线找到大量帮助。事实上,正则表达式在处理此问题时几乎没有问题。
第二次更新
对此没有一般解决方案; 你不能唯一地解决一些问题,例如1.23E116
:是单个浮点数,还是浮点数后跟整数6
或16
?
但是,如果您可以解决这种歧义,我相信您再次拥有可以使用正则表达式解决的问题。FORTRAN E格式要求允许您从字符串中拉出一个浮点数,因为该点前面只有一个数字。例如:
126.022E232.71828E001.5E01
如下
12 integer
6.022E23 float
2.71828 float
15.0 float
https://stackoverflow.com/questions/-100006628
复制相似问题