【发布时间】:2020-07-29 04:49:14
【问题描述】:
我正在将大量金融时间序列数据写入单个 CSV 文件。在一个例子中,我发现 to_csv 方法反复失败,但我终其一生都无法弄清楚原因。在调用 to_csv 方法期间,所有内容都会挂起 10-15 分钟以上。在因错误而崩溃之前:
Traceback(最近一次调用最后一次):文件 "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", 第 274 行,在 _save self._save_header() 文件 "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\formats\csvs.py", 第 242 行,在 _save_header 中 writer.writerow(encoded_labels) OSError: [Errno 22] Invalid argument
在处理上述异常的过程中,又发生了一个异常:
OSError: [Errno 22] 无效参数
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):文件“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: [Errno 22] 无效参数
在写入 csv 文件的标题行时,它似乎挂断了。我将相同的帧写入 hdf,然后从 hdf 加载,并使用 hdf 加载的帧,重现相同(或非常接近相同)的失败:
Traceback(最近一次调用最后一次):文件 "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", 第 274 行,在 _save self._save_header() 文件 "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\formats\csvs.py", 第 242 行,在 _save_header 中 writer.writerow(encoded_labels) PermissionError: [Errno 13] Permission denied
在处理上述异常的过程中,又发生了一个异常:
PermissionError: [Errno 13] 权限被拒绝
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):文件“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] Permission denied
当从较大的代码体转移到小示例问题时,不确定为什么它从“OSError: [Errno 22] Invalid argument”变为“PermissionError: [Errno 13] Permission denied”。我已经搜索了与 to_csv 方法相关的这些错误,并且发现以前版本的 pandas 可能有类似的问题,但这应该在以后的版本中解决。我的熊猫是:
安装版本 ------------------ 提交:无 python:3.7.3.final.0 python-bits:64 操作系统:Windows 操作系统版本:10 机器:AMD64 处理器:Intel64 系列6 Model 94 Stepping 3, GenuineIntel byteorder: little LC_ALL: None LANG: 无 LOCALE: None.None
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:无 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)] :: Anaconda, Inc. on win32
我试过了:
- 在调用 to_csv 之前将 index 转换为 str 为 astype(str),同样的问题
- 由于存在大量 NaN 条目(最初此帧是更大的多索引帧的一部分),索引(行)上的 dropna 问题仍然存在
- 关键字参数 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_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.')
综合以上两行写入尝试的成功和失败,让我认为这不是与特定列值相关的问题。此外,回溯让我认为这个问题与编写列标题有关。但问题是我有 3000 多个其他 DataFrames 具有完全相同的列标签,它们使用 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”或其他东西的旧文件都有旧引用....多么令人沮丧。让我们希望一个简单的重启解决它。
谢谢!
【问题讨论】:
-
superuser.com/questions/613313/… PRN 在 Windows 操作系统下不能作为有效的文件名!这有多疯狂。
标签: python pandas export-to-csv errno