python - 指定 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')
解决方案
使用 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 中获取
推荐阅读
- npm - 如何在不依赖 bower 的情况下运行 web-component-tester 来测试 vanilla web-component
- excel - 如何修复此代码中的“Error438:对象不支持此属性或方法”?
- xcode - Xcode 默认 gcc (mis) 配置为为 iOS 而不是 macOS 编译
- swift - 在 ARKit 中转换 SIMD2 位置和标记
- laravel-5.4 - 如何解决 Laravel 5.4 中的“BadMethodCallException Method Illuminate\Routing\Route::getParameter 不存在”异常?
- c++ - 使用 CImg 的 mandelbrot 集无法获得颜色平滑度
- python - 直接来自 3 个数组(两个 1-D 和一个 2-D )的 Python 3d 绘图
- python-3.x - 这可以为图像完成吗
- r - 根据应用于多列的规则识别要删除的行
- vue.js - 路由更改时如何更新我的 Vue 组件?