我的目录中包含以下格式的数据文件:
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秒......而且,我想要就地修改文件(覆盖)。
答案 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')