首页 > 解决方案 > 指定 csv 中每一列的长度(填充)

问题描述

我正在尝试重新排列文件以匹配 BACS 银行格式。为了使它工作,下面的 csv 中的列需要具有特定的长度。我已经弄清楚了 abcdabcd 列,因为它是一个重复模式(文件中还有几个),但是有几列具有我无法轻易定位的随机数。

有没有办法让我定位(理想情况下)基于其标题的特定列,或者将所有内容定位到逗号以屠宰可能有用的东西?在下面的示例文件中,您将看到值发生变化的三列。如果将所有内容定位到特定字符是解决方案,我正在考虑使用 .ljust 将列填充到指定长度(然后在 excel 中手动对其进行排序)。

原始文件

a,b,c,d,e,f,g,h,i,j,k
12345,1234567,0,11,123456,12345678,1234567,abcdabcd,A ABCD
123456,12345678,0,11,123456,12345678,12345678,abcdabcd,A ABCD
123456,1234567,0,11,123456,12345678,12345,abcdabcd,A ABCD
12345,1234567,0,11,123456,12345678,1234567,abcdabcd,A ABCD
123456,12345678,0,11,123456,12345678,123456789,abcdabcd,A ABCD

理想输出

a,b,c,d,e,f,g,h,i,j,k
123450,12345670,0,11,123456,12345678,123456700,abcdabcd,A ABCD
123456,12345678,0,11,123456,12345678,123456780,abcdabcd,A ABCD
123456,12345670,0,11,123456,12345678,123450000,abcdabcd,A ABCD
123450,12345670,0,11,123456,12345678,123456700,abcdabcd,A ABCD
123456,12345678,0,11,123456,12345678,123456789,abcdabcd,A ABCD

代码

with open('file.txt', 'r') as file :
  filedata = file.read()

filedata = filedata.replace('12345', '12345'.ljust(6, '0'))
with open('file.txt', 'w') as file:
  file.write(filedata)

编辑:类似于这个Python 的东西 - 如何向整数/字符串添加零?但是,要么针对每个标题的特定列,要么至少针对第一个。

编辑2:

我正在使用以下内容重新排列我的列,可以修改它以使用字符串长度吗?

import pandas as pd

## Read csv / tab-delimited in this example
df = pd.read_csv('test.txt', sep='\t')

## Reorder columns
df = df[['h','i','c','g','a','b','e','d','f','j','k']]

## Write csv / tab-delimited
df.to_csv('test', sep='\t')

标签: pythonpython-3.xcsv

解决方案


使用 pandas,您可以将列转换为str然后使用.str.pad. 您可以使用请求的长度制作一个 dict:

lengths = {
    "a": 6,
    "b": 8,
    "c": 3,
    "d": 6,
    "e": 8,
}

并像这样使用它:

result = pd.DataFrame(
    {
        column_name: column.str.pad(
            lengths.get(column_name, 0), side="right", fillchar="0"
        )
        for column_name, column in df.astype(str).items()
    }
)

如果fillchar每列不同,您也可以从 dict 中获取


推荐阅读