【问题标题】:Opening CSV file with pd.read_csv - any purpose for context manager?使用 pd.read_csv 打开 CSV 文件 - 上下文管理器有什么用途?
【发布时间】:2017-09-18 22:45:48
【问题描述】:

我开始阅读 Nunez-Iglesias 等人的 Elegant SciPy。 al,当打开书中的第一个数据集(.txt 文件)时,作者使用

filename = 'data/counts.txt'
with open(filename, 'rt') as f:
    data_table = pd.read_csv(f, index_col=0) # Parse file with pandas

但我认为read_csv 会关闭文件,因为它正在打开给定文件描述符(请参阅Andy Hayden's answer here)。

那么这里的上下文管理器有什么用途吗,或者我们可以安全地写

filename = 'data/counts.txt'
data_table = pd.read_csv(filename, index_col=0) 

【问题讨论】:

    标签: python file pandas dataframe


    【解决方案1】:

    您可以将文件句柄传递给read_csv 或传入文件名。在第一种情况下,您创建文件句柄,因此您有责任再次关闭它。但是,如果您传入一个文件名称,那么read_csv 将代表您打开该文件并再次关闭它(在适当的时候)。

    所以在大多数情况下,只提供文件名是更简单的选择:

    data_table = pd.read_csv(filename, index_col=0) 
    

    请注意,传入文件句柄的选项允许您传入类似文件的对象:

    >>> from io import StringIO
    >>> import pandas as pd
    >>> myio = StringIO("""a b c
    ... 0 1 2 3
    ... 1 4 5 6""")
    >>> pd.read_csv(myio, sep=' ', header=0, index_col=0)
       a  b  c
    0  1  2  3
    1  4  5  6
    

    但是,实际上将真实文件句柄传递给read_csv 是相当罕见的。我能想到的唯一情况是熊猫无法打开文件本身。例如,如果它是使用不常见的压缩算法压缩的。

    【讨论】:

    • 当然,所以也许作者只是想灌输一个好的做法,但这里不需要。谢谢,我只是想确定我没有遗漏任何东西。
    • 我想是的。我不知道是否有充分的理由将文件句柄传递给read_csv。但是,可能文件已被压缩(使用 pandas 未知的格式),然后您别无选择,只能自己解压缩并将文件句柄传递给 read_csv。在这种情况下,最好知道文件句柄是您的责任。
    • 刚刚发现了一个很好的用例:当我使用抽象层(例如 Pyfilesystem)时,我使用fs 模块打开文件,然后将filehandle 传递给pandas。跨度>
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2020-04-02
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多