如何修复格式错误的csv文件中的最后一列?

2024-10-06 14:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大(~80gb)的csv文件,它的格式是以空格作为分隔符的,但是最后一列有空格,因此在尝试用pandas读入它时让我非常头疼

以下是我正在处理的csv的一小部分:

7.942891 7.3e-004 14.64 14.28 14 8 1.2e+001 0.00 6.2e-005 1.2e+000 1.0e-050 4.6e+005 0.54 -1.00 0 0 0.0e+000 0.0e+000 -0.13 -0.18 -0.08 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7)
7.943618 7.3e-004 14.64 12.31 14 14 1.3e+001 0.11 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
7.943619 1.0e-006 14.64 12.31 14 14 1.3e+001 0.11 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
17.199911 9.3e+000 14.64 12.31 14 14 1.3e+001 0.11 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
26.363639 9.2e+000 14.64 12.31 14 14 1.3e+001 0.11 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
35.435729 9.1e+000 14.64 12.31 14 14 1.3e+001 0.11 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
44.417096 9.0e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
53.308649 8.9e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
62.111285 8.8e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
70.825893 8.7e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
79.453355 8.6e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
87.994540 8.5e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
96.450313 8.5e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
104.821527 8.4e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
113.109027 8.3e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
121.313652 8.2e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2
129.436229 8.1e+000 14.64 12.31 14 14 1.3e+001 0.10 6.2e-005 5.2e-005 1.0e-050 1.0e-050 0.54 0.50 0 0 0.0e+000 0.0e+000 -2.28 -0.72 -1.59 48.79 28.89 1.9e+003 0.69 -5200 12709 MT1(2-1) SN1 CE2(14-4;14-7) SN2

最后一列应该是 参赛作品:

MT1(2-1) SN1 CE2(14-4;14-7)

MT1(2-1) SN1 CE2(14-4;14-7) SN2

我不知道该怎么做

多谢各位

编辑:

我可以通读文件并用逗号替换每行的前27个空格,但是我有很多非常大的文件,有什么方法可以让我做得更快吗

with open(dat_file, 'r') as file:
    for line in file:
        line = line.replace(' ', ',', 27)
        print(line)

Tags: 文件csv编辑pandas格式line作品file
1条回答
网友
1楼 · 发布于 2024-10-06 14:28:57

您自己的解决方案看起来相当有效,但我会将输出写入文件,而不是尝试捕获输出。此外,对于一个将要执行大约10亿次的循环,最好使循环的内容尽可能紧凑:

with open(dat_file, 'r') as fin, open(f'fixed_{dat_file}', 'w') as fout:
    for line in fin:
        fout.write(line.replace(' ', ',', 27))

假设您希望在一个数据帧中加载80 GB的数据,那么您很可能在具有多个CPU核心的系统上运行此功能。您可以在CPU之间分配工作;每个CPU从不同的点开始读取文件。您可以创建大小正确的空文件,如下所示:

import os
fsize = os.stat(dat_file).st_size
# create empty (holy) output file
with open(f'fixed_{dat_file}', 'w') as fout:
    fout.seek(fsize-1)
    fout.write(' ')

(在Linux中,这将创建一个“神圣”文件,在您实际向其写入数据之前,它不会占用磁盘空间。)您必须处理块的开始和结束,以避免出现部分行

然后可以使用the ^{} package来管理流程

但是,如果您有许多类似的大型文件,那么将单个文件分配给每个CPU可能更为实际

相关问题 更多 >