You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:10:28