2017-01-26 4 views
1

Итак, я нашел часть ответа, который мне нужен здесь, в следующей ссылке, и он работает до тех пор, пока мои файлы csv находятся в формате 2015-03-01,1,2,3,1,3 для первого столбца. Как сохранить эту работу, когда первый столбец изменения в 2015-03-01 00:00:00.000Разделить большой файл csv на основе даты в первом столбце Python 3.4.3

How to split a huge csv file based on content of first column?

import csv 
from itertools import groupby 

for key, rows in groupby(csv.reader(open("largeFile.csv", "r", encoding='utf-16')), 
        lambda row: row[0]): 
with open("%s.txt" % key, "w") as output: 
    for row in rows: 
     output.write(",".join(row) + "\n") 

Поэтому у меня есть один большой файл с примерно 1.7million строк в нем ...

2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.03,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.03,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

И программа действительно создает новый текстовый документ для каждого дня, что здорово!

Но когда колонны выглядят следующим образом, он перестает работать.

2015-03-01 00:00:01.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-01 00:00:02.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-02 00:00:01.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-02 00:00:02.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-02 00:00:03.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-03 00:00:01.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-03 00:00:02.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

, и это дает мне сообщение об ошибке.

Traceback (most recent call last): File "C:\Python34\Proj\documents\New folder\dataPullSplit2.py", line 6, in with open("%s.txt" % key, "w") as output: OSError: [Errno 22] Invalid argument: '2015-03-01 00:00:00.000.txt'

Может кто-нибудь указать мне в правильном направлении здесь, пожалуйста.

Found Temp Solution 

ОК, так что, изменив его с «ш» на «» Я теперь добавление к файлам и с помощью key[:-13] я смог отрезать штамп времени на имени файла ... это работает ... но это МЕДЛЕННО ... как я могу улучшить это и понять, почему он идет так медленно?

Вот код Сейчас

import csv 
from itertools import groupby 

for key, rows in groupby(csv.reader(open("asdf2.txt", "r", encoding='utf-16')), 
        lambda row: row[0]): 

with open("%s.txt" % key[:-13], "a") as output: 
    for row in rows: 
     output.write(",".join(row) + "\n") 

ответ

1

Предполагая, что ваши файлы должны сохранить шаблон 2015.01.01, чистка key должно работать:

key = key.split()[0].replace('-', '.') 

Полный код:

import csv 
from itertools import groupby 


def shorten_key(key): 
    return key.split()[0].replace('-', '.') 


for key, rows in groupby(csv.reader(open("asdf2.txt", "r", encoding='utf-16')), 
         lambda row: shorten_key(row[0])): 

    with open("%s.txt" % shorten_key(key), "a") as output: 
     for row in rows: 
      output.write(",".join(row) + "\n") 

Быстрый испытание:

keys = ['2015-03-01 00:00:02.000', '2015.01.01'] 

for key in keys: 
    print(key.split()[0].replace('-', '.')) 

Выход:

2015.03.01 
2015.01.01 
+0

Ну, что, безусловно, работает, как я надеялся, что его сейчас. Единственная проблема, с которой я столкнулся в настоящее время, - это фактическая скорость ее ... В моем файле, который имеет правильное форматирование даты в первый раз, разделение его на 1-дневный приращение занимает от нескольких секунд до минуты, это грубо 270mb и разбивает каждый файл на 86400 строк, так как это количество секунд в каждый день. В следующем файле, где он также показывает часы минут секунд. 000 и т. Д., Расщепление всего на один день от него занимает примерно 7-10 минут. Огромная разница. –

+1

Похоже, что он открывает и закрывает файл много раз, потому что он генерирует так много групп. Группировка по сокращенному ключу, т. Е. Должна помочь только дата. См. Мой обновленный ответ. –

+0

Это ускорило процесс, как ожидалось. Мне было интересно, было ли это то, что он делал, когда я впервые изменил «w» на «a», потому что заметил, что он просто перезаписывает один и тот же файл снова и снова. –