Pandas DataFrame.to_csv () OSError: [Errno 22] Недопустимый аргумент и PermissionError: [Errno 13] Разрешение отклонено - PullRequest
1 голос
/ 16 апреля 2020

Я записываю большое количество данных финансовых временных рядов в отдельные файлы CSV. В одном случае я обнаружил, что метод to_csv повторяется, но я не могу понять, почему. Во время вызова метода to_csv все просто зависает на 10-15 минут. Перед сбоем с ошибкой:

Трассировка (последний последний вызов): Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 172, в файле сохранения self._save ()" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 274, в _save self._save_header () Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py", строка 242, в _save_header writer.writerow (encoded_labels) OSError: [Errno 22] Недопустимый аргумент

Во время обработки вышеупомянутого исключения произошло другое исключение:

OSError: [Errno 22] Недопустимый аргумент

Во время обработки вышеупомянутого исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "securitiesArchives.py", строка 1072, в out_df.to_csv ("PRN.csv", mode = 'w', кодировка = 'UTF-8', сжатие = нет) Файл " C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generi c .py ", строка 3020, в файле to_csv formatter.save ()" * 1 101 *: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 187, в save f.close () OSError: [Errno 22] Неверный аргумент

Кажется, что он зависает при записи строки заголовка файла csv. Я записал этот же кадр в hdf, затем загрузил из hdf и, используя загруженный hdf кадр, воспроизвел тот же (или очень близкий к тому же) сбой:

Traceback (последний вызов был последним): Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py", строка 172, в файле save self._save (). "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 274, в файле _save self._save_header ()" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs .py ", строка 242, в _save_header writer.writerow (encoded_labels) PermissionError: [Errno 13] В доступе отказано

Во время обработки вышеуказанного исключения произошло другое исключение:

PermissionError: [Errno 13] В доступе отказано

Во время обработки вышеупомянутого исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "bad_archive.py", строка 12, в # out_df.to_csv ("PRN.csv", mode = 'w', encoding = 'UTF-8', сжатие = нет) Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generi c .py ", строка 3020, в файле to_csv formatter.save ()" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 187, в save f.close () PermissionError: [Errno 13] Разрешение отклонено

Не уверен, почему он изменился с" OSError: [Errno 22] Недопустимый аргумент «to» PermissionError: [Errno 13] Разрешение отклонено »при переходе от более крупного тела кода к небольшой примерной проблеме. Я искал эти ошибки в связи с методом to_csv и видел, что в предыдущей версии pandas могли быть похожие проблемы, но это должно было быть решено в более поздней версии. Мой pandas:

УСТАНОВЛЕННЫЕ ВЕРСИИ ------------------ commit: None python: 3.7.3.final.0 python -бит: 64 ОС: Windows Выпуск ОС: 10 Машина: AMD64 Процессор: Intel64 Семейство 6 Модель 94 Шаг 3, Подлинный метеородел Intel: маленький LC_ALL: Нет LANG: Нет LOCALE: Нет. Нет

pandas: 0.24.2 pytest: 5.0.1 pip: 19.1.1 setuptools: 41.0.1 Cython: 0.29.12 numpy: 1.16.4 scipy: 1.2.1 pyarrow: нет xarray: нет I Python: 7.6.1 сфинкс: 2.1.2 пирсинг: 0.5.1 дата: 2.8.0 pytz: 2019.1 blos c: нет узких мест: 1.2.1 таблицы: 3.5.2 numberxpr: 2.6.9 перо: нет matplotlib: 3.1. 0 openpyxl: 2.6.2 xlrd: 1.2.0 xlwt: 1.3.0 xlsxwriter: 1.1.8 l xml .etree: 4.3.4 bs4: 4.7.1 html5lib: 1.0.1 sqlalchemy: 1.3.5 py mysql : Нет psycopg2: нет jinja2: 2.10.1 s3fs: нет fastparquet: нет pandas_gbq: нет pandas_datareader: 0.8.1 gcsfs: нет

Я на 64-битной машине win-10 с использованием Anaconda Python 3.7.3 (по умолчанию, 24 апреля 2019 г., 15:29:51) [MS C v.1915 64 бит (AMD64)] :: Anaconda, In c. на win32

я пытался:

  • преобразовать индекс в str в astype (str) перед вызовом to_csv, та же проблема
  • dropna для индекса (строки) как было большое количество записей NaN (первоначально этот кадр был частью гораздо большего многоиндексного фрейма) проблема сохраняется
  • аргументы ключевых слов headers = False и index = False, ни один не изменил поведение.
  • Использование .loc [] для нарезки только первой строки и выполнения to_csv на этом

out_df.loc[out_df.index.values[0]].to_csv("PRN.csv",mode='w',encoding='UTF-8' ,compression=None)

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

FutureWarning: подпись Series.to_csv была выровнена с подписью DataFrame.to_csv, а аргумент header будет измените значение по умолчанию с False на True: передайте явное значение для подавления этого предупреждения.

  • Попробовал снова тот же метод, что и выше, вместо того, чтобы разрезать первые две строки, чтобы убедиться, что они остались в кадре и не преобразуется в серию

Весь двухрядный DataFrame, который отказывается от сотрудничества с to_csv out_df.loc[out_df.index.values[0]:out_df.index.values[1]].to_csv("PRN.csv",mode='w',encoding='UTF-8' ,compression=None,index=False,header=False)

Но это также не удалось, как и раньше. Однако я смог записать последовательность каждого столбца независимо в собственный CSV-файл без проблем.

for col_name in out_df.columns:
   print('Writing '+col_name+' as CSV')
    out_df[col_name].to_csv(col_name.replace(' ','_')+"_PRN.csv",mode='w',encoding='UTF-8' ,compression=None)
    print('Done.')

В совокупности вышеуказанный успех и неудача попытки записи в два ряда заставляют меня думать, что это не проблема, связанная с указанными c значениями столбцов. Кроме того, трассировки заставляют меня думать, что эти проблемы связаны с написанием заголовков столбцов. Но дело в том, что у меня есть 3000+ других DataFrames с точно такими же метками столбцов, и они пишут в csv, используя to_csv без проблем. На данный момент я вне моей глубины.

Неоднократно происходит сбой на одном и том же наборе данных, независимо от того, использую ли я данные, которые я записал в hdf, или использую fre sh pull из Yahoo с помощью yfinance. Следующий код надежно воссоздает проблему в моей системе:

import pandas as pd
import yfinance as yf

good_df = yf.download(tickers='AAPL',interval='1m',period='7d')
bad_df = yf.download(tickers='PRN',interval='1m',period='7d')
print('Writing test case AAPL as CSV')   
good_df.to_csv("AAPL.csv",mode='w',encoding='UTF-8' ,compression=None) 
print('Writing test case PRN as CSV')   
bad_df.to_csv("PRN.csv",mode='w',encoding='UTF-8' ,compression=None) 

У кого-нибудь есть какие-либо идеи?

PS - При повторном чтении я решил проверить метки столбцов на эквивалентность и насколько логическое сравнение касается идентификаторов «хорошего» DataFrame и «плохого» DataFrame как идентичных.

>>>print(good_df.columns)
Index(['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object') 
>>>print(bad_df.columns)
Index(['Open', 'High', 'Low', 'Close', 'Adj Close','Volume'], dtype='object') 
>>>print(good_df.columns == bad_df.columns)
[ True  True  True  True  True  True]

PPS - я также попытался удалить все флаги из to_csv, хотя они должны были быть по умолчанию ценности. Это было перенесено из того, что использовалось в другом коде, и я просматривал другие значения, чтобы посмотреть, сработает ли это. Большинство базовых вызовов c to_csv, как и прежде, завершается неудачно

import pandas as pd
import yfinance as yf

good_df = yf.download(tickers='AAPL',interval='1m',period='7d')
bad_df = yf.download(tickers='PRN',interval='1m',period='7d')
print('Writing test case AAPL as CSV')   
good_df.to_csv("AAPL.csv") 
print('Writing test case PRN as CSV')   
bad_df.to_csv("PRN.csv") 

Обновление В ответ на ответ от Cheng

я не вижу файлов в проводнике или через dir в консоли. Но чтобы проверить это, я использовал новое имя файла, которое не было символом «PRN», и вот оно работает.

Я не думал, что это проблема, поскольку я уже пытался писать в другое место назначения папка, как в большем родительском коде, а затем в игрушке проблемы. Ни один из них не работал.

Казалось бы, windows имеет старую ссылку на любой старый файл с именем "PRN.csv" или что-то в этом роде ... как расстраивает. Будем надеяться, что простой перезапуск исправит это.

Спасибо!

1 Ответ

2 голосов
/ 16 апреля 2020

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

Когда файл открывается в другой программе, вы не можете писать или добавлять к нему Это. Проверьте места, где вы могли забыть close() или если они открыты для просмотра в Microsoft Excel.

Также обычно лучше использовать open('file', 'a') для записи на случай, если там были какие-либо предыдущие данные, которые вы сохранили. Если нет, то он сделает то же самое, что и open('file','w'), и создаст новый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...