Python csv;获取所有列的最大长度,然后将所有其他列延长到该长度

时间:2016-10-11 15:40:30

标签: python csv

我的目录中包含以下格式的数据文件:

4 2 5 7
1 4 9 8
8 7 7 1
  4 1 4
    1 5
    2 0
    1 0
    0 0
    0 0

它们由制表符分隔。第三列和第四列包含有用的信息,直到它们达到“零”为止。此时,它们被任意填充为零,直到文件结束。

我希望得到最长列的长度,我们不计算“零”和“零”。底部的价值观。在这种情况下,最长的列是第3列,长度为7,因为我们忽略底部的零。然后我想通过在它们上面填充零来转换所有其他列,直到它们的长度等于我的第三列的长度(除了列4 b / c它已经用零填充)。然后我想摆脱我所有列中超出最大长度的所有零..所以我想要的文件输出如下:

4 2 5 7
1 4 9 8
8 7 7 1
0 4 1 4
0 0 1 5
0 0 2 0
0 0 1 0

这些文件平均每行包含约100,000行......因此处理它们需要一段时间。无法真正找到一种有效的方法。由于文件读取的方式(逐行),我是否正确地假设为了找到列的长度,我们需要在最坏的情况下处理N行?其中N是整个文件的长度。当我运行脚本打印出所有行时,每个文件花了大约10秒......而且,我想要就地修改文件(覆盖)。

2 个答案:

答案 0 :(得分:0)

嗨,我会用Pandas和Numpy:

import pandas as pd
import numpy as np

df = pd.read_csv('csv.csv', delimiter='\t')
df = df.replace(0,np.nan)
while df.tail(1).isnull().all().all() == True:
  df=df[0:len(df)-1]
df=df.replace(np.nan,0)
df.to_csv('csv2.csv',sep='\t', index=False) #i used a different name just for testing

使用csv数据创建DataFrame 有很多内置函数可以处理NaN值,因此将所有0更改为nan。 然后从结尾tail(1)开始,检查该行是否为all() NaN。如果是这样,将DF复制到最后一行并重复。 我用100k行做了这个,只用了几秒钟。

答案 1 :(得分:0)

以下是两种方法:

# Read in the lines and fill in the zeroes
with open('input.txt') as input_file:
    data = [[item.strip() or '0' 
             for item in line.split('\t')]
            for line in input_file]

# Delete lines near the end that are only zeroes
while set(data[-1]) == {'0'}:
    del data[-1]

# Write out the lines
with open('output.txt', 'wt') as output_file:
    output_file.writelines('\t'.join(line) + '\n' for line in data)

或者

with open('input.txt') as input_file:
    with open('output.txt', 'wt') as output_file:
        for line in input_file:
            line = line.split('\t')
            line = [item.strip() or '0' for item in line]
            if all(item == '0' for item in line):
                break
            output_file.write('\t'.join(line))
            output_file.write('\n')