分割列号不一致的csv文件

时间:2019-04-12 01:34:05

标签: python python-3.x pandas

我有一个CSV文件,其格式如下,不同之处在于它大约有2000万行:

A,B,C,D
1,2,3,4
1,1,3,4
1,0,0,1,4,3
1,0,5,6,2,1

我尝试用这样的熊猫来阅读:

df = pd.read_csv(_out_path, sep=',', engine='c') # engine c because it's faster

这会导致以下错误:

ParserError: Error tokenizing data. C error: Expected 18 fields in line 13674206, saw 31

使用上面的测试文件pandas可以处理此问题,并在前两行中添加两个未命名的列,其中包含np.NAN。

A   B   C   D   Unnamed: 4  Unnamed: 5
0   1   2   3   4   NaN NaN
1   1   1   3   4   NaN NaN
2   1   0   0   1   4.0 3.0
3   1   0   5   6   2.0 1.0

但是,对于真实文件(不幸的是,我无法共享),它会导致上述错误。

我正在寻找一种解决方法,方法是查找逗号最多的行,计算逗号的Nr,并根据需要在每行中添加尽可能多的逗号,以便熊猫可以读取文件。 还是理想情况下,无论如何还是以更简单的方式读取文件。


编辑:

数据是从数百个CSV文件中串联而成的,但在中间添加了新列(不幸的是,并非所有列都在末尾)。 因此,一个好的解决方案(感谢您的评论)将是在条目的nr发生变化的地方分割文件。

此外,文件中没有标题。在此示例中,我尝试在第一行中手动添加它们,因此我想在拆分文件后必须添加标题。

1 个答案:

答案 0 :(得分:2)

为了获得干净的数据集,最好将它们分成单独的文件。

如果列数只会增加而永不减少,则可以使用字典轻松跟踪不​​同的目标文件:

source_file = open('mixed_data.csv', 'r')

destination_files = {}

for line in source_file:
    item_count = len(line.split(','))

    try:
        dest_file = destination_files[item_count]

    except KeyError:
        file_name = 'split_data_' + str(item_count) + '.csv'
        dest_file = destination_files[item_count] = open(file_name, 'w')

    dest_file.write(line)

for dest_file in destination_files.values():
    dest_file.close()

source_file.close()

如果程序紧随其后结束或保留了文件对象的绑定范围,则关闭不是严格必要的,但是无论如何都是一种好习惯。