我需要编辑输入,从一个程序,与固定宽度列工作。我成功地加载了它并计算出了我需要的内容,但是我不知道如何保存已编辑的文件以保持相同的列宽度。
import pandas as pd
file = pd.read_fwf('file.inp',
colspecs = [(0, 6), (6, 11), (11, 16), (16, 20), (20, 22),
(22, 26), (26, 38), (38, 46), (46, 54), (54, 61),
(61, 68), (68, 90)])
问题是列之间的空格数或数据字符串的长度不同,所以我不能简单地在列之间添加固定数量的空格。
要编辑的文件如下所示:
ATOM 873 N ALA A 59 41.629 23.754-163.394 1.00 12.93 N
ATOM 5089 NH1 ARG A 315 21.344 -13.371 187.612 1.00 66.09 N1+
ATOM 7839 H5'' A B 3 31.406 -4.882-165.817 1.00 16.98 H
HETATM 7766 H161 G3A B 1 42.941 1.714-165.146 1.00 14.70 H
它是数字、字符串、特殊字符和列粘合在一起的混合物。
发布于 2020-01-21 13:10:40
正如我评论的那样,我在熊猫身上找不到write_fdf
方法。但是,我认为您可以通过tabulate
实现您想要的结果。我基于这个职位编写了以下代码,但我还没有运行它:
import pandas as pd
from tabulate import tabulate
df = pd.read_fwf('file.inp',
colspecs = [(0, 6), (6, 11), (11, 16), (16, 20), (20, 22),
(22, 26), (26, 38), (38, 46), (46, 54), (54, 61),
(61, 68), (68, 90)])
with open("...", "w") as f:
f.write(
tabulate(
[list(row) for row in df.values],
tablefmt="plain"
)
)
请再次注意,我没有运行这个程序,只是演示如何使用表:
headers
参数,如果需要,可以使用该参数更多关于表格这里的信息
UPDATE:我认识到输出需要与特定的列对齐,因此下面的内容似乎足够接近(可能需要进行小规格编辑):
import pandas as pd
import sys
# Mock data
lst = [
["ATOM", 873, "N", "ALA", "A", 59, 41.629, 23.754, -163.394, 1.00, 12.93, "N"],
["ATOM", 5089, "NH1", "ARG", "A", 315, 21.344, -13.371, 187.612, 1.00 ,66.09, "N1+"],
["ATOM", 7839, "H5''", "A", "B", 3, 31.406, -4.882, -165.817, 1.00, 16.98, "H" ],
["HETATM", 7766, "H161", "G3A", "B", 1, 42.941, 1.714, -165.146, 1.00, 14.70, "H"],
]
# NOTE the spaces at the end, only when needed
colspecs = [
"{: <6} ", # left, width=6
"{: >4} ", # right, width=4
"{: >4} ",
"{: >3} ",
"{: >1} ",
"{: >3} ",
"{: >11} ",
"{: >7}",
"{: >8} ",
"{: >5} ",
"{: <15} ",
"{: <3}",
]
def write_fdf(fpath, pd, specs):
"""
Write a Pandas dataframe in fixed width column format with the given
column specs
Args:
fpath: File path
ps: Dataframe
specs: A list of python formats
"""
with open(fpath, "w") as f:
for _, row in df.iterrows():
for idx, value in enumerate(row):
sys.stdout.write(specs[idx].format(value))
f.write(specs[idx].format(value))
f.write("\n")
print("")
df = pd.DataFrame(lst)
write_fdf("/tmp/out.dat", pd, colspecs)
输出:
$ python ~/tmp/test.py
ATOM 873 N ALA A 59 41.629 23.754-163.394 1.0 12.93 N
ATOM 5089 NH1 ARG A 315 21.344 -13.371 187.612 1.0 66.09 N1+
ATOM 7839 H5'' A B 3 31.406 -4.882-165.817 1.0 16.98 H
HETATM 7766 H161 G3A B 1 42.941 1.714-165.146 1.0 14.7 H
$ cat /tmp/out.dat
ATOM 873 N ALA A 59 41.629 23.754-163.394 1.0 12.93 N
ATOM 5089 NH1 ARG A 315 21.344 -13.371 187.612 1.0 66.09 N1+
ATOM 7839 H5'' A B 3 31.406 -4.882-165.817 1.0 16.98 H
HETATM 7766 H161 G3A B 1 42.941 1.714-165.146 1.0 14.7 H
但是,我在格式化中看到了一个似乎违反规则的异常: row=0,col=2:"N“似乎在您的示例中居中。
https://stackoverflow.com/questions/59841303
复制相似问题