2015-06-01 17 views
0

Напишите функцию с именем file_split(filename, number_of_files), которая будет разбивать входной файл на несколько выходных файлов. Файлы должны быть разделены как можно более равномерно. Когда длина файла равномерно делится на количество создаваемых файлов (10-строчный файл, разбитый на 2 файла, каждый выходной файл должен иметь 5 строк. Если длина не делится на части, длина всех выходных файлов не должна иметь разница больше 1. Например, файл из 10 строк, разделенных на 3, будет иметь выходные файлы длиной 3, 3 и 4.Python Разделить файлы на несколько файлов меньшего размера

Я написал свой код, но не могу понять, как сделать разницу больше чем 1 часть, мне нужна помощь в изменении моего кода, чтобы включить эту часть (код у меня создает новый файл для последней строки, если он не кратен)

def get_line_counts(filename, number_of_files): 
    try: 
     my_file = open(filename, 'r') 
    except IOError: 
     print("File does not exist") 
     return  
    input = my_file.read().split('\n') 
    outputBase = 'lel'  
    total_lines = 0 
    with open('myfile.txt') as infp: 
     for line in infp: 
      if line.strip(): 
       total_lines +=1  
    base_size = total_lines // number_of_files  
    at = 1 
    for lines in range(0, len(input), base_size): 
     outputData = input[lines:lines+base_size] 
     output = open(outputBase + str(at) + '.txt', 'w') 
     output.write('\n'.join(outputData)) 
     output.close() 
     at += 1 
+0

возможно дубликат [Как разбить файл на количество выходных файлов в Python 3?] (http://stackoverflow.com/questions/30572321/how-to-split-file-into-number-of-output-files-in-python-3) – zero323

+0

* «Создать функцию ...» *? Мы ваши рабы, что вы можете дать нам команды? –

+0

@Stefan Pochmann Вы прочитали следующий абзац? –

ответ

0

Round-Robin работ и легко:

with open('myfile.txt') as infp: 
    files = [open('%d.txt' % i, 'w') for i in range(number_of_files)] 
    for i, line in enumerate(infp): 
     files[i % number_of_files].write(line) 
    for f in files: 
     f.close() 
+0

Спасибо, очень помогает –

0

Непроверено:.

Я хотел бы использовать модульную арифметику

res = len(lines) % number_of_files 
for lines in range(0, len(input), base_size): 
    if at == len(input)+res+1: 
     outputData = input[lines:-1] 
    else: 
     ... 

То есть, просто свалка оставшуюся часть строки в последний файл.

+1

Это не то, что он хочет, см. Комментарии zero323 –

+0

Спасибо, не совсем то, что мне было нужно, но по-прежнему полезно! –

0

из будущего импорт print_function

import boto3 
import shutil 
import os 
import os.path 
import urllib 
import json 
import urllib2 
import subprocess 
import linecache 
import sys 

s3client = boto3.client('s3') 
s3 = boto3.resource('s3') 
def lambda_handler(event, context): 
    try: 
     for record in event['Records']: 
      bucket = record['s3']['bucket']['name'] 
      key = record['s3']['object']['key'] 
      print(key) 
      p = key.rsplit('/',1) 
      keyfile =p[1] 
      print("S Object: " + keyfile + " is a FILE") 
      inpfilename = keyfile 
      ou = inpfilename.split('.',1) 
      outfilename = ou[0] 
      print("inpfilename :" + inpfilename) 
      body = s3client.get_object(
             Bucket=bucket, 
             Key=key 
             )["Body"].read().split('\n') 

      lines_per_file = 3 # Lines on each small file 
      created_files = 0 # Counting how many small files have been created 
      op_rec=''  # Stores lines not yet written on a small file 
      lines_counter = 0 # Same as len(lines) 
      for line in body: # Go throught the whole big file 
       op_rec = op_rec + '\n' + line 
       lines_counter += 1 
       if lines_counter == lines_per_file: 
        idx = lines_per_file * (created_files + 1) 
        body_contents = str(op_rec) 
        file_name = "%s_%s.txt" %(outfilename, idx) 
        target_file = "folder-name/" + file_name 
        print(target_file) 
        s3client.put_object(ACL='public-read',ServerSideEncryption='AES256', Bucket='bucket-name',Key= target_file, Body=body_contents) 
        op_rec ='' # Reset variables 
        lines_counter = 0 
        created_files += 1 # One more small file has been created 
      # After for-loop has finished 
      if lines_counter: # There are still some lines not written on a file? 
       idx = lines_per_file * (created_files + 1) 
       body_contents = str(op_rec) 
       file_name = "%s_%s.txt" %(outfilename, idx) 
       target_file = "folder-name/" + file_name 
       print(target_file) 
       s3client.put_object(ACL='public-read',ServerSideEncryption='AES256', Bucket='bucket-name',Key= target_file, Body=body_contents) 
       created_files += 1 

      print ('%s small files (with %s lines each) were created.' % (created_files,lines_per_file)) 


    except Exception as e: 
      print(e) 
Смежные вопросы