为何Python numpy不遵循指定分隔符?固定宽度文件写入问题
写入固定宽度格式文件的问题解决
问题背景
我是Python新手,想要写入固定宽度格式的文件。尝试使用numpy的np.savetxt函数时,发现无论指定什么分隔符,函数都不遵守,导致列之间始终有空格,无法得到紧凑的固定宽度输出。
原代码
import pandas as pd import numpy as np data = { "Make": ['BMW', 'Toyota', 'Dodge', 'Honda'], "Model": ['X5', 'Camry', 'Caravan', 'Accord'], "Weight": [1020.25, 950.98, 1235.37, 940.9], "Year": [2021, 2023, 2019, 2014] } # load data into a DataFrame object: df = pd.DataFrame(data) print(df) with open('test_output.txt', 'w') as outfile: fmt = '%-6s %-7s %-7s %-4s' np.savetxt(outfile, df.values, delimiter='*', fmt=fmt) # Testing with any delimiter
问题原因
当np.savetxt的fmt参数是一个包含多个格式说明符的完整字符串时,delimiter参数会被直接忽略——因为这个字符串本身已经定义了每行的输出格式,包括字段之间的分隔(你原代码中fmt里的空格就是字段间的分隔)。
解决方案
方案1:调整numpy的格式字符串
直接修改fmt,去掉格式说明符之间的空格,不需要指定delimiter:
import pandas as pd import numpy as np data = { "Make": ['BMW', 'Toyota', 'Dodge', 'Honda'], "Model": ['X5', 'Camry', 'Caravan', 'Accord'], "Weight": [1020.25, 950.98, 1235.37, 940.9], "Year": [2021, 2023, 2019, 2014] } df = pd.DataFrame(data) with open('test_output.txt', 'w') as outfile: # 去掉格式符之间的空格,实现紧凑的固定宽度输出 fmt = '%-6s%-7s%-7s%-4s' np.savetxt(outfile, df.values, fmt=fmt)
方案2:用pandas直接生成固定宽度文本(更适合DataFrame场景)
针对pandas DataFrame,使用to_string方法自定义列格式,更直观:
import pandas as pd data = { "Make": ['BMW', 'Toyota', 'Dodge', 'Honda'], "Model": ['X5', 'Camry', 'Caravan', 'Accord'], "Weight": [1020.25, 950.98, 1235.37, 940.9], "Year": [2021, 2023, 2019, 2014] } df = pd.DataFrame(data) # 为每列定义固定宽度的格式化规则 formatters = { 'Make': lambda x: f'{x:<6}', # 左对齐,占6位 'Model': lambda x: f'{x:<7}', # 左对齐,占7位 'Weight': lambda x: f'{x:<7}', # 左对齐,占7位 'Year': lambda x: f'{x:<4}' # 左对齐,占4位 } # 生成无索引、无表头的固定宽度文本 fixed_width_content = df.to_string(index=False, header=False, formatters=formatters) with open('test_output.txt', 'w') as outfile: outfile.write(fixed_width_content)
如果需要输出表头,只需删除header=False参数即可。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

