python将所有单元格的char长度固定为csv

6ojccjat  于 9个月前  发布在  Python
关注(0)|答案(1)|浏览(102)

我试图找出一种方法来打印的字符串到csv文件(与标签为sep,我不会有兴趣在阅读它作为csv在未来),看起来不错。
现在我已经找到了一种方法来做到这一点:
1.将现有标题转换为列表。
1.遍历上述列表中的所有项目,将它们转换为字符串,使用ljust固定长度(通过添加尾随空格)到最高字符计数,并将它们分配回相同的列表
1.将头列表重新分配回DF
1.遍历所有其余的df单元格,将它们转换为字符串,使用ljust为固定长度,这是所有单元格的最高字符数,并将它们重新分配回先前的位置。
1.使用to_csv,sep =“\t”
输出的csv看起来像我想要的,但我想知道是否有一个与pandas相关的现有方法可以自动完成这一点?即,计算出最高的字符数,相应地添加尾随空格,并打印到csv,看起来像漂亮的表格,而不必将它们复制和粘贴到电子表格中。

dkqlctbz

dkqlctbz1#

你问的问题有一个矛盾:

  • 如果你希望输出是有效的CSV(即可以通过pd.read_csv()读回),那么你可以使用sep='\t',但你的列将是锯齿状的(每列只有1个'\t'分隔。
  • 另一方面,如果你想让文件中的列对齐,那么你应该使用df.to_string(index=False)。但这不是一个CSV文件。
  • 最后,你可以通过填充空格来修改数据,甚至使它仍然是有效的CSV(仍然是sep='\t'),但是当你读回它时,你会得到不同的数据。

示例:

在下面的所有例子中,我们没有指定要写入的文件,所以输出是一个字符串,我们打印它。将文件名作为第一个参数传递给.to_csv().to_string()以写入文件。

设置

为了更一般化一点,多了一列:

# setup
df = pd.DataFrame({
    'name': ['Saul Goodman', 'JMM'],
    'foo': ['hello', 'wonderful world'],
    'age': [49, 50],
})

字符串

有效的制表符分隔CSV

# tab-separated CSV
>>> print(df.to_csv(sep='\t', index=False))
name    foo age
Saul Goodman    hello   49
JMM wonderful world 50

不是CSV,所有列都视觉对齐

# to string (all columns are aligned)
>>> print(df.to_string(index=False))
        name             foo  age
Saul Goodman           hello   49
         JMM wonderful world   50

填充字符串列和制表符分隔

仍然有效的CSV(制表符分隔),但数据已 * 修改 *(填充):

strcols = df.dtypes == 'O'
strcols = strcols[strcols].index.tolist()
lens = df[strcols].applymap(len).max()

rename = {k: f'{k:<{v}s}' for k, v in lens.items()}
>>> print(df.assign(**{
...     k: df[k].str.pad(v, 'right')
...     for k, v in lens.items()
... }).rename(rename, axis=1).to_csv(index=False, sep='\t'))
name            foo             age
Saul Goodman    hello           49
JMM             wonderful world 50

相关问题