如何保持分隔符 space 相对于 (+/-) 数字的大小?
How to maintain the size of delimiter space with respect to (+/-) digits?
我需要制作一个 8 列的小模板,用白色 space 分隔,如下所示:
预期输出:
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 049.2 0 2000
3142 3144 3147 3149 1 065.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
但由于第 6 列中存在负值,我得到了不相等的白色 space,如下所示:
实际输出:
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 049.20 0 2000
3142 3144 3147 3149 1 065.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
所以我的目标是 trim 白色 space 根据我在预期输出中提到的第 6 列中的 +/- 值数字。
这是我的代码:
from string import Template
import sys
fw=open("sample.txt","w")
DIHRES = ['3139;3142;3144;3147;169.13', '3144;3147;3165;3167;49.20', '3142;3144;3147;3149;65.02',
'3142;3144;3147;3165;-168.52', '3144;3147;3149;3150;-172.09', '3144;3147;3165;3161;171.15']
for i in DIHRES:
A1 = (i.split(";")[0]).strip()
A2 = (i.split(";")[1]).strip()
A3 = (i.split(";")[2]).strip()
A4 = (i.split(";")[3]).strip()
ANG = (i.split(";")[4]).strip()
str = '''
$A1 $A2 $A3 $A4 1 $ANG 0 2000
'''
s = Template(str.strip() + "\n")
fw.write(s.substitute(A1=A1, A2=A2, A3=A3, A4=A4, ANG=ANG.rjust(6, '0')))
提前致谢
一个更简单的解决方案是使用format
。将最后一项转换为浮点数并使用浮点数格式(7 个宽度,小数点后 2 位)。 0 表示前导零,冒号后的 space 表示放置 space 表示正数,-
表示负数:
DIHRES = ['3139;3142;3144;3147;169.13',
'3144;3147;3165;3167;49.20',
'3142;3144;3147;3149;65.02',
'3142;3144;3147;3165;-168.52',
'3144;3147;3149;3150;-172.09',
'3144;3147;3165;3161;171.15']
for item in DIHRES:
data = item.split(';')
data[-1] = float(data[-1])
print('{} {} {} {} 1 {: 07.2f} 0 2000'.format(*data))
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 049.20 0 2000
3142 3144 3147 3149 1 065.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
您在 ANG 中最长的字符串是 7 个字符
-172.09
而你试图证明只有 6
.rjust(6, '0')
只需更改此行:
fw.write(s.substitute(A1=A1, A2=A2, A3=A3, A4=A4, ANG=ANG.rjust(6, '0')))
至:
fw.write(s.substitute(
A1=A1.rjust(6), A2=A2.rjust(6), A3=A3.rjust(6),
A4=A4.rjust(6), ANG=ANG.rjust(8)))
>>>
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 49.20 0 2000
3142 3144 3147 3149 1 65.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
在设置列时,我喜欢明确地证明每个列的合理性;所以所有都是 .rjust(6) 除了我需要更多并使用 .rjust(8)
的列
另外,我认为你只需要空格而不是零;所以我删除了你的那部分代码。
更进一步,如果您输入的数据如下:
'3144;3147;3165;3167;49.2'
甚至
'3144;3147;3165;3167;49'
而不是:
'3144;3147;3165;3167;49.20'
这可以通过第一个将列格式化为包含 2 个小数位的字符串来解决:
fw.write(s.substitute(A1=A1.rjust(6), A2=A2.rjust(6),
A3=A3.rjust(6), A4=A4.rjust(6),
ANG=('%.2f' % float(ANG)).rjust(8)))
通过这种方式,无论该列的输入如何,您都可以保持小数点对齐,这是我认为您真正想要的;比 "expected solution":
049.2
Mark Tolonen 的 .format 解决方案还解决了 2 位小数浮点数问题
我需要制作一个 8 列的小模板,用白色 space 分隔,如下所示:
预期输出:
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 049.2 0 2000
3142 3144 3147 3149 1 065.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
但由于第 6 列中存在负值,我得到了不相等的白色 space,如下所示:
实际输出:
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 049.20 0 2000
3142 3144 3147 3149 1 065.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
所以我的目标是 trim 白色 space 根据我在预期输出中提到的第 6 列中的 +/- 值数字。
这是我的代码:
from string import Template
import sys
fw=open("sample.txt","w")
DIHRES = ['3139;3142;3144;3147;169.13', '3144;3147;3165;3167;49.20', '3142;3144;3147;3149;65.02',
'3142;3144;3147;3165;-168.52', '3144;3147;3149;3150;-172.09', '3144;3147;3165;3161;171.15']
for i in DIHRES:
A1 = (i.split(";")[0]).strip()
A2 = (i.split(";")[1]).strip()
A3 = (i.split(";")[2]).strip()
A4 = (i.split(";")[3]).strip()
ANG = (i.split(";")[4]).strip()
str = '''
$A1 $A2 $A3 $A4 1 $ANG 0 2000
'''
s = Template(str.strip() + "\n")
fw.write(s.substitute(A1=A1, A2=A2, A3=A3, A4=A4, ANG=ANG.rjust(6, '0')))
提前致谢
一个更简单的解决方案是使用format
。将最后一项转换为浮点数并使用浮点数格式(7 个宽度,小数点后 2 位)。 0 表示前导零,冒号后的 space 表示放置 space 表示正数,-
表示负数:
DIHRES = ['3139;3142;3144;3147;169.13',
'3144;3147;3165;3167;49.20',
'3142;3144;3147;3149;65.02',
'3142;3144;3147;3165;-168.52',
'3144;3147;3149;3150;-172.09',
'3144;3147;3165;3161;171.15']
for item in DIHRES:
data = item.split(';')
data[-1] = float(data[-1])
print('{} {} {} {} 1 {: 07.2f} 0 2000'.format(*data))
3139 3142 3144 3147 1 169.13 0 2000 3144 3147 3165 3167 1 049.20 0 2000 3142 3144 3147 3149 1 065.02 0 2000 3142 3144 3147 3165 1 -168.52 0 2000 3144 3147 3149 3150 1 -172.09 0 2000 3144 3147 3165 3161 1 171.15 0 2000
您在 ANG 中最长的字符串是 7 个字符
-172.09
而你试图证明只有 6
.rjust(6, '0')
只需更改此行:
fw.write(s.substitute(A1=A1, A2=A2, A3=A3, A4=A4, ANG=ANG.rjust(6, '0')))
至:
fw.write(s.substitute(
A1=A1.rjust(6), A2=A2.rjust(6), A3=A3.rjust(6),
A4=A4.rjust(6), ANG=ANG.rjust(8)))
>>>
3139 3142 3144 3147 1 169.13 0 2000
3144 3147 3165 3167 1 49.20 0 2000
3142 3144 3147 3149 1 65.02 0 2000
3142 3144 3147 3165 1 -168.52 0 2000
3144 3147 3149 3150 1 -172.09 0 2000
3144 3147 3165 3161 1 171.15 0 2000
在设置列时,我喜欢明确地证明每个列的合理性;所以所有都是 .rjust(6) 除了我需要更多并使用 .rjust(8)
的列另外,我认为你只需要空格而不是零;所以我删除了你的那部分代码。
更进一步,如果您输入的数据如下:
'3144;3147;3165;3167;49.2'
甚至
'3144;3147;3165;3167;49'
而不是:
'3144;3147;3165;3167;49.20'
这可以通过第一个将列格式化为包含 2 个小数位的字符串来解决:
fw.write(s.substitute(A1=A1.rjust(6), A2=A2.rjust(6),
A3=A3.rjust(6), A4=A4.rjust(6),
ANG=('%.2f' % float(ANG)).rjust(8)))
通过这种方式,无论该列的输入如何,您都可以保持小数点对齐,这是我认为您真正想要的;比 "expected solution":
049.2
Mark Tolonen 的 .format 解决方案还解决了 2 位小数浮点数问题