Python 如何分割文件

Python 如何分割文件,python,awk,Python,Awk,我有以下格式的文本文件: 10900 PART1 3211034 10900 PART2 3400458 10900 PART4 3183857 10900 PART3 4152115 10900 PART5 3366650 10900 PART6 1548868 10920 PART3 4154075 10920 PART2 3404018 10920 PART1 3207571 10920 PART4 31785

我有以下格式的文本文件:

10900   PART1   3211034
10900   PART2   3400458
10900   PART4   3183857
10900   PART3   4152115
10900   PART5   3366650
10900   PART6   1548868
10920   PART3   4154075
10920   PART2   3404018
10920   PART1   3207571
10920   PART4   3178505
10920   PART6   1882924
10920   PART5   3363267
10940   PART6   2183534
10940   PART3   4153924
10940   PART4   3178554
10940   PART1   3207436
10940   PART5   3363585
10940   PART2   3404220
我想分割文件-首先,按第一列;第二,第3列的总和不大于10000000

以下是我根据第一列拆分文件的代码:

file1=open ('Normal_All_TracNum_mod')
data=[]

for line in file1.readlines():
line_split=line.split()
data.append(line_split)

RCV_check= data[0][0]
filewrite=open(RCV_check,"w")

for i in range(0,len(data)):
    if (data[i][0] == RCV_check):
        filewrite.write(data[i][0]+ "          "+data[i][1]+'\n')

    else:
        RCV_check=data[i][0]
        filewrite.close()
        filewrite=open(RCV_check,"w")
        filewrite.write(data[i][0]+ "          "+data[i][1]+'\n')   
filewrite.close()
如我所愿输出:

File 1
 10900  PART1   3211034
 10900  PART2   3400458
 10900  PART4   3183857
File 2
 10900  PART3   4152115
 10900  PART5   3366650
 10900  PART6   1548868
...etc

我需要在每个文件中有相同的第1列和第3列的总和(3211034+3400458+3183857),不大于10000000,以此类推,用于其他文件

如果我没有弄错您的规格,下面的吼声可能适合您。基本上,它检查第二个字段是否大于1000,如果大于1000,则将其打印到
filec
c
是计数器),然后重置第二个字段的总和并递增文件计数器,等等

awk 'BEGIN {c=1}
     $3>10000000 {print $0 > ("file" c) ; c++ ; sum=0 } 
     $3< 10000000 {print $0 > ("file" c) ; sum+=$3 ; if (sum> 10000000) {sum=0;c++}}' INPUTFILE
awk'开始{c=1}
3美元> 10000000 {打印0美元>(文件)C;C++;求和=0 }
$3<10000000{print$0>(“文件”c);sum+=3;if(sum>10000000){sum=0;c++}}'INPUTFILE
如果要在第一列D和第三列D的总和上拆分:

awk 'NR==1 {f=$1; c=1 ; fname=f c ; s=$3 ; print $0 > (fname)}
     NR>1  {if ($1 != f) {f=$1 ; c=1 ; fname=f c; s=$3 } } 
     NR>1  {if (s<10000000) {print $0 > (fname); s+=$3} else {c++;fname=f c;s=$3; print $0 > (fname)} }' INPUTFILE  
awk'NR==1{f=$1;c=1;fname=fc;s=$3;print$0>(fname)}
NR>1{if($1!=f){f=$1;c=1;fname=fc;s=$3}}
NR>1{if(s(fname);s+=$3}else{c++;fname=fc;s=$3;print$0>(fname)}'输入文件

是的,我知道这可以缩短…

我不明白你想对第一列做什么。但是,这里有一些python尊重对第二列和的约束

fileID=itertools.count(1) 以open('path/to/file')作为填充: 总和=0 阈值=10000000 outfile=open(“文件%d”%fileID,“w”)


希望这有帮助

这里有一种使用awk的方法:

awk '{ s+=$3 } s>=10000000 || $1!=x { s=$3; c++ } { print > "File" c; x=$1 }' file
这将创建7个文件。下面是
grep.File*
的输出,显示了每个文件的内容:

File1:10900   PART1   3211034
File1:10900   PART2   3400458
File1:10900   PART4   3183857
File2:10900   PART3   4152115
File2:10900   PART5   3366650
File2:10900   PART6   1548868
File3:10920   PART3   4154075
File3:10920   PART2   3404018
File4:10920   PART1   3207571
File4:10920   PART4   3178505
File4:10920   PART6   1882924
File5:10920   PART5   3363267
File6:10940   PART6   2183534
File6:10940   PART3   4153924
File6:10940   PART4   3178554
File7:10940   PART1   3207436
File7:10940   PART5   3363585
File7:10940   PART2   3404220

请完成你的句子“最后我…”我不明白你的问题。你想如何分割列,以及确定哪些行写入哪个文件的标准是什么?我不太明白分割的逻辑。为什么在文件2中你还有一个path1对象?你不想在不同的文件中分离它们吗?第一个标准是第一列,第二个标准是秒ond colume并没有在每个文件中超过x个数字…第二个colume的总和并没有超过x个数字,,,我希望这能说明清楚…不要试图在评论中放入格式化文本,因为它不会起作用,如果有更多的事情要说,就编辑你的原始帖子,看起来好像有。你似乎在做额外的工作:
awk'BEGIN{c=1}{sum+=$3;if(sum>10000000){sum=0;c++};print>FILENAME.“.c}”
Yep,这是我在Glenjackman的第一个想法,但问题是“我需要在每个文件中有相同的列1,并且对于其他文件,列3的总和(3211034+3400458+3183857)不大于10000000,以此类推……”(并且它被编辑了几次…)答案已更正,现在可以正常工作。一个小提示@Majid阅读常见问题解答@,如果答案有帮助,就投票给它,如果它解决了你的问题,就接受它。
cat File*
似乎比
grep.File*
更自然地显示文件的内容。@willampersell:谢谢,伙计。不幸的是,我认为
cat
显示不了他是谁?
File1:10900   PART1   3211034
File1:10900   PART2   3400458
File1:10900   PART4   3183857
File2:10900   PART3   4152115
File2:10900   PART5   3366650
File2:10900   PART6   1548868
File3:10920   PART3   4154075
File3:10920   PART2   3404018
File4:10920   PART1   3207571
File4:10920   PART4   3178505
File4:10920   PART6   1882924
File5:10920   PART5   3363267
File6:10940   PART6   2183534
File6:10940   PART3   4153924
File6:10940   PART4   3178554
File7:10940   PART1   3207436
File7:10940   PART5   3363585
File7:10940   PART2   3404220