Команда to_csv в цикле For не работает должным образом - PullRequest
0 голосов
/ 31 января 2019

У меня есть 11 файлов в моем каталоге, который начинается с 'case-export-'.Для каждого из этих файлов я хочу извлечь только 5 столбцов, как указано в переменной 'initial_columns', сохранить результаты в фрейме данных с именем 'whole_file' и записать фрейм данных 'whole_file' в CSV.Поскольку у меня есть 11 файлов, которые соответствуют 'case-export-' в моем каталоге, у меня должно быть 11 CSV, сгенерированных моим сценарием.

Когда я запускаю приведенные ниже сценарии, у меня генерируется только 1 CSV, и этот CSV содержит данные из самого последнего файла, прочитанного циклом For.

date = dt.datetime.today().strftime("%m_%d_%Y")
directory = '/Users/myname/Downloads/'
initial_columns = ['Case #','Case Subject','Created At','Labels','Body'] 

for file in (glob.glob(directory + 'case-export-*')):
    whole_file=pd.read_csv(file, usecols = initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)   
    whole_file.to_csv(directory + 'case_export_trimmed_' + date + '_' + str(now.hour) + '_' + str(now.minute) + '_' + str(now.second) + '.csv')

Я знаю, как обойти это, добавив пустой фрейм данных и затем конкатенируя каждый «целый_файл» к фрейму данных, когда он проходит цикл.Я попробовал это, и это сработало отлично.Однако я пытаюсь понять, почему мой оригинальный скрипт, который я показал выше, не работал должным образом и почему он выдал только 1 CSV вместо 11. Пожалуйста, сообщите.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Возможно, вы объявили переменную date и now вне цикла, что означает

whole_file.to_csv (directory + 'case_export_trimmed_' + date + '' +str (now.hour) + '' + str (now.minute) + '_' + str (now.second) + '.csv') '

будет перезаписано в ту же записьфайл для каждой из 11 итераций, поэтому в выходном файле вы увидите только детали 11-й итерации

0 голосов
/ 31 января 2019

Как правило, лучшим решением для использования даты (час / мин / секунда) является сохранение старого имени файла, но либо префикс, либо суффикс его с усеченным:

for file in (glob.glob(directory + 'case-export-*')):
    whole_file = pd.read_csv(file, usecols=initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)
    trimmed_file = file.replace("case-export-", "case-export-trimmed-")   
    # or trimmed_file = file.replace(".csv", "-trimmed.csv")   
    whole_file.to_csv(trimmed_file)

Таким образом, у вас естьболее четкая запись / понимание от просмотра имен файлов, что произошло / намерение было ...

0 голосов
/ 31 января 2019

Я думаю, причина этого в том, что сейчас определено вне вашего цикла for.Поэтому каждый раз, когда вы используете его, вы используете одни и те же часы, минуты и секунды в имени файла CSV, и в результате вы каждый раз перезаписываете один файл.

Если вы переместите сейчас определение переменной внутри вашего цикла for должно работать:

for file in (glob.glob(directory + 'case-export-*')):
    now = datetime.datetime.now()
    date = dt.datetime.today().strftime("%m_%d_%Y")
    whole_file=pd.read_csv(file, usecols = initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)   
    whole_file.to_csv(directory + 'case_export_trimmed_' + date + '_' + str(now.hour) + '_' + str(now.minute) + '_' + str(now.second) + '.csv')

* EDIT : Также перемещено date определение внутри вашего цикла for для получения точной даты

Также я бы сделал следующее для генерации имени файла:

for file in (glob.glob(directory + 'case-export-*')):
    csv_file_name = df.datetime.now().strftime("%m_%d_%Y_%H_%M_%S")
    whole_file=pd.read_csv(file, usecols = initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)   
    whole_file.to_csv(directory + 'case_export_trimmed_' + csv_file_name + '.csv')
...