2014-11-20 132 views
0

我有一个包含50个文件的目录。每个文件大约有10万行。我解析文件并提取符合特定条件的行。新文件比第一个文件小得多,大概在30K行左右。我想从输入文件读取并写入输出文件,直到输出文件达到100K行。之后,我会创建一个新的输出文件并继续写入它。像这样的东西Python - 在原始文件超过N行后创建一个新文件

import os 
path='/path/to/directory' 
listing=os.listdir(path) 
with open('outfile','w') as f2: 
    for filename in listing: 
     for line in filename: 
      if condition met: 
       f2.write(line) 

从目录中读取所有文件,并将所有文件写入outfile。现在,如何设置创建新outfile的条件,比如outfile1达到100K行时outfile1?

+0

添加一个计数器和一个条件吗? – 2014-11-20 16:58:27

+1

您是否考虑过使用'logging'而不是手动写入文件? – Kevin 2014-11-20 17:00:23

+0

如何添加一个条件?我并不是真正有经验的Python(正如你所看到的)。我需要继续从输入文件列表中读取并不断创建新的输出文件。凯文,我看到日志记录是一个选项,但我没有经验 – user201411 2014-11-20 17:02:53

回答

0

一些伪代码,我想它更容易摆脱文件上下文(它节省了打开和关闭相同的文件多次)的:

count, sk, lines = 100000, 0, 0 
f2 = open('outfile0', 'w') 
for filename in listing:     
    for line in filename: 
     if condition met:    
      if lines > count:     
       f2.close() 
       sk, lines = sk+1, 0 
       f2 = open('outfile%s'%sk, 'w') 
      f2.write(line) 
      lines += 1 
f2.close() 
+0

您还需要检查边界条件。我会更新答案,以便稍后包含... gtr – GeneralBecos 2014-11-20 17:12:18

0

打开该目录作为第一个命令行参数传递。我用random.randint()编写了一个虚拟条件来测试脚本,并设置每行文件的限制为10行:

import sys 
import os 
import random 

assert os.path.isdir(sys.argv[1]) 
listing = os.listdir(sys.argv[1]) 

l_index, f_name, f_index, f_max = 0 , 1, 0, 10 

f2 = open('outfile0','w') 

for filename in listing: 

    with open(sys.argv[1]+"/"+listing[l_index],'r') as f1: 

     for line in f1: 

      if (f_index > f_max): 
       f2.close() 
       f2 = open('outfile'+str(f_name),'w') 
       f_index, f_name = 0, f_name + 1 

      if random.randint(0,100)%100 > 50: 
       f2.write(line) 
       f_index += 1 
相关问题