Pandas DataFrame.to_csv()OSError:[Errno 22]无效的参数和PermissionError:[Errno 13]权限被拒绝

问题描述 投票:0回答:1

我正在将大量财务时间序列数据写入单个CSV文件。在一个实例中,我发现to_csv方法反复失败,但是我无法一生找出原因。在调用to_csv方法期间,所有操作都将挂起10-15分钟以上。在崩溃之前出现错误:

跟踪(最近一次通话):文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,第172行,保存self._save()文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,_save中的第274行self._save_header()文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,_save_header中的第242行writer.writerow(encoded_labels)OSError:[Errno 22]无效参数

在处理以上异常期间,发生了另一个异常:

OSError:[Errno 22]无效的参数

在处理以上异常期间,发生了另一个异常:

追踪(最近一次通话):文件“ securitiesArchives.py”,第1072行,在out_df.to_csv(“ PRN.csv”,mode ='w',encoding ='UTF-8',compression = None)文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generic.py”,第3020行,在to_csv中formatter.save()文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,第187行,保存f.close()OSError:[错误22]无效的参数

似乎在写csv文件的标题行时挂断了。我将相同的帧写入hdf,然后从hdf加载,并使用hdf加载的帧,再现了相同(或非常接近)的故障:

跟踪(最近一次通话):文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,第172行,保存self._save()文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,_save中的第274行self._save_header()文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,_save_header中的第242行writer.writerow(encoded_labels)PermissionError:[Errno 13]权限被拒绝

在处理以上异常期间,发生了另一个异常:

[PermissionError:[Errno 13]权限被拒绝

在处理以上异常期间,发生了另一个异常:

追踪(最近一次通话):文件“ bad_archive.py”,第12行在#out_df.to_csv(“ PRN.csv”,mode ='w',encoding ='UTF-8',compression = None)文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generic.py”,第3020行,在to_csv中formatter.save()文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ formats \ csvs.py”,第187行,保存f.close()PermissionError:[Errno 13]权限被拒绝

不确定从较大的代码体转移到较小的示例问题时,为什么将其从“ OSError:[Errno 22]无效的参数”更改为“ PermissionError:[Errno 13]权限被拒绝”。我搜索了与方法to_csv相关的这些错误,并发现以前版本的熊猫可能有类似的问题,但是应该在以后的版本中解决。我的熊猫是:

已安装的版本------------------提交:无python:3.7.3.final.0 python-bits:64 OS:Windows OS-release:10计算机:AMD64处理器:Intel64家族6模型94 Steping 3,正版Intel字节序:little LC_ALL:无LANG:无位置:无。无

熊猫:0.24.2 pytest:5.0.1点:19.1.1 setuptools:41.0.1 Cython:0.29.12 numpy:1.16.4 scipy:1.2.1 pyarrow:无xarray:无IPython:7.6.1 sphinx:2.1.2 patsy:0.5.1 dateutil:2.8.0 pytz:2019.1 blosc:无瓶颈:1.2.1表格:3.5.2 numexpr:2.6.9羽毛:无matplotlib:3.1.0 openpyxl:2.6.2 xlrd:1.2.0 xlwt:1.3.0 xlsxwriter:1.1.8 lxml.etree:4.3.4 bs4:4.7.1 html5lib:1.0.1 sqlalchemy:1.3.5 pymysql:无psycopg2:无jinja2:2.10.1 s3fs:无fastparquet:无pandas_gbq:无pandas_datareader:0.8.1 gcsfs:无

[我在使用Anaconda Python 3.7.3的Win-10 64位计算机上(默认,2019年4月24日,15:29:51)[MSC v.1915 64位(AMD64)] ::在Win32上的Anaconda,Inc.

我尝试过:

  • 在调用to_csv之前,将索引转换为str转换为astype(str),>
  • 由于存在大量的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:请传递一个明确的值以禁止显示此警告。

  • 再次尝试与上述相同的方法,而不是先对前两行进行切片以确保它仍然是一帧并且不会转换为序列

The entire two row DataFrame which refuses cooperation with to_csvout_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.')

结合上述成功和两行写入尝试的失败,使我认为这不是与特定列值相关的问题。此外,回溯使我认为此问题与编写列标题有关。但是问题是我有3000多个其他DataFrame,它们具有完全相同的列标签,并且它们使用to_csv写入csv时没有问题。在这一点上,我超出了深度。

无论我使用的是写到hdf的数据还是使用yfinance的yahoo的新提取,重复发生的同一套数据都会失败。以下代码在我的系统上可靠地重新创建了该问题:

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-在重新阅读时,我决定检查列标签的等效性,并且就布尔比较而言,“好”数据框的值与“坏”数据框的值相同。

>>>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中删除所有标志,尽管它们应该是默认值。它是其他代码中的遗留物,我正在研究不同的值以查看它是否有效。最基本的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") 

更新以回复程的答复

我无法在资源管理器中或通过控制台的目录看到任何文件。但是为了测试这一点,我使用了一个新文件名,该文件名不是符号“ PRN”,所以看起来它确实有效。

我不认为这是问题所在,因为我已经尝试过在较大的父代码中然后在玩具问题中写入另一个目标文件夹。都不起作用。

似乎Windows对任何名为“ PRN.csv”或…的旧文件都有旧引用。希望可以通过简单的重新启动来解决它。

谢谢!

我正在将大量财务时间序列数据写入单个CSV文件。在一个实例中,我发现to_csv方法反复失败,但是我无法一生找出原因。 ...

python pandas export-to-csv errno
1个回答
1
投票

我今天早些时候确实遇到了同样的问题,但是由于我使用的数据要小得多,因此更容易发现解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.