文件是如何实现的?

2024-01-02

我很好奇文件在 python 中是如何工作的。文件是如何实现的,以便能够像这样循环:

csv_file = open("filename.csv", "r")
for line in csv_file:
    # do something with line

如果您使用的是 Python 2,则细节会有点模糊;alexmcf 的回答 https://stackoverflow.com/a/30792730/908494涵盖了基础知识,您可以从那里查找更多详细信息。

如果您使用的是 Python 3,所有内容都详细记录在io https://docs.python.org/3/library/io.html模块,并带有一个合理可读的纯Python实现 https://hg.python.org/cpython/file/defauly/Lib/_pyio.py在 stdlib 中,所有这些都构建在一个非常简单的“原始文件”接口之上(FileIO在 Unix 上的 POSIX 本机文件描述符之上实现)。

The IOBase https://docs.python.org/3/library/io.html#i-o-base-classesABC/mixin 提供了__iter__方法基于readline method:

IOBase(及其子类)支持迭代器协议,这意味着IOBase可以迭代对象来生成流中的行。根据流是二进制流(产生字节)还是文本流(产生字符串),行的定义略有不同。看readline() below.

如果你看3.5 源码里面 https://hg.python.org/cpython/file/3.5/Lib/_pyio.py#l516,就像您期望的那样简单:

def __iter__(self):
    self._checkClosed()
    return self

def __next__(self):
    line = self.readline()
    if not line:
        raise StopIteration
    return line

当然,在 CPython 3.1+ 中,如果可能的话,可以使用 C 加速器来代替 Python 代码,但是它看起来很相似 https://hg.python.org/cpython/file/3.5/Modules/_io/iobase.c#l609:

static PyObject *
iobase_iter(PyObject *self)
{
    if (_PyIOBase_check_closed(self, Py_True) == NULL)
        return NULL;

    Py_INCREF(self);
    return self;
}

static PyObject *
iobase_iternext(PyObject *self)
{
    PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);

    if (line == NULL)
        return NULL;

    if (PyObject_Size(line) == 0) {
        Py_DECREF(line);
        return NULL;
    }

    return line;
}

返回的文件对象open,并自动创建诸如sys.stdout,以及在 stdlib 中其他位置创建的大多数或所有文件对象(GzipFile等),是TextIOWrapper https://docs.python.org/3/library/io.html#io.TextIOWrapper(对于文本文件),或BufferedRandom https://docs.python.org/3/library/io.html#io.BufferedRandom, BufferedReader, or BufferedWriter(对于二进制文件),它们都继承了此行为IOBase。没有什么可以阻止不同的文件类覆盖__iter__(或注册IOBase作为 ABC 而不是继承它),但我不知道有任何这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件是如何实现的? 的相关文章

  • 与 iexact 一起使用时,Django get_or_create 无法设置字段

    我想用name iexact with get or create尽可能避免用户输入字段的重复 我的提供者模型有一个名称字段 我在其中使用get or create 查找工作正常 但在第一次创建实例时 如下面的 p1 Timber 示例 名
  • PyList_SetItem 与 PyList_SETITEM

    据我所知 PyList SetItem 和 PyList SETITEM 之间的区别在于 PyList SetItem 会降低它覆盖的列表项的引用计数 而 PyList SETITEM 不会 我有什么理由不应该一直使用 PyList Set
  • 编辑 scikit-learn 决策树

    我想编辑 sklearn DecisionTree 例如改变条件或切割节点 叶子等 但似乎没有功能可以做到这一点 如果我可以导出到文件 编辑它以导入 如何编辑决策树 环境 Windows 10 python3 3 sklearn 0 17
  • Python:记录垃圾收集器

    我有一个 python 应用程序 有一些性能问题 我想将垃圾收集器的事件 特别是何时调用 添加到我的日志中 是否可以 thanks http docs python org library gc html gc set debug http
  • 子进程改变目录

    我想在子目录 超级目录中执行脚本 我需要首先进入该子目录 超级目录 我无法得到subprocess进入我的子目录 tducin localhost Projekty tests ve python Python 2 7 4 default
  • conda 无法从 yml 创建环境

    我尝试运行下面的代码来从 YAML 文件创建虚拟 Python 环境 我在 Ubuntu 服务器上的命令行中运行代码 虚拟环境名为 py36 当我运行下面的代码时 我收到下面的消息 环境也没有被创建 这个问题是因为我有几个必须使用 pip
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • Python 正则表达式部分匹配或“hitEnd”

    我正在编写一个扫描器 因此我将任意字符串与正则表达式规则列表进行匹配 如果我可以模拟 Java hitEnd 功能 不仅知道正则表达式何时不匹配 还知道何时匹配 这将非常有用 can t匹配 当正则表达式匹配器在决定拒绝输入之前到达输入末尾
  • 在Python中创建一个新表

    我正在尝试从数控机床中提取数据 事件每毫秒发生一次 我需要过滤掉一些用管道 分隔的变量分隔符 PuTTy exe 程序生成的日志文件 我尝试阅读熊猫 但列不在同一位置 df pd read table data log sep 日志文件的一
  • 错误:无法访问文件“$libdir/plpython2”:没有这样的文件或目录

    我正在运行 postgresql 9 4 PostgreSQL 9 4 4 on x86 64 unknown linux gnu compiled by gcc GCC 4 1 2 20070626 Red Hat 4 1 2 14 64
  • 一行Python和SQLite代码,为什么需要加“,”? [复制]

    这个问题在这里已经有答案了 c execute INSERT INTO numbers VALUES random randint 0 100 如果我将上面的代码更改为 c execute INSERT INTO numbers VALUE
  • 如何从 Python 中指定运行程序的输入文件?

    我正在编写一个外部脚本 以通过笔记本电脑上的 Python mrjob 模块 而不是在 Amazon Elastic Compute Cloud 或任何大型集群上 运行 mapreduce 作业 我读自mrjob文档 http packag
  • 如何使用 PySpark 有效地将这么多 csv 文件(大约 130,000 个)合并到一个大型数据集中?

    我之前发布了这个问题并得到了一些使用 PySpark 的建议 如何有效地将这一大数据集合并到一个大数据框中 https stackoverflow com questions 60259271 how can i merge this la
  • 如何检查列表是否为空?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 如果通过以下内容 a 我如何检查是否a是空的 if not a print Lis
  • 为什么“return self”返回 None ? [复制]

    这个问题在这里已经有答案了 我正在尝试获取链的顶部节点getTopParent 当我打印出来时self name 它确实打印出了父实例的名称 然而 当我回来时self 它返回 None 为什么是这样 class A def init sel
  • 如何向 SCons 构建添加预处理和后处理操作?

    我正在尝试在使用 SCons 构建项目时添加预处理和后处理操作 SConstruct 和 SConscript 文件位于项目的顶部 预处理动作 生成代码 通过调用不同的工具 gt 不知道在此预处理之后将生成的确切文件 可以创建用于决定生成哪
  • 为什么 bot.get_channel() 会产生 NoneType?

    我正在制作一个 Discord 机器人来处理公告命令 当使用该命令时 我希望机器人在特定通道中发送一条消息 并向用户发送一条消息以表明该命令已发送 但是 我无法将消息发送到频道 我尝试了这段代码 import discord import
  • 获取调用者文件的绝对路径

    假设我在不同的目录中有两个文件 1 py 比如说 在C FIRST FOLDER 1 py and 2 py 比如说 在C SECOND FOLDER 2 py 文件1 py进口2 py using sys path insert 0 pa
  • scipysolve_ivp() 中的访问时间步长

    我有一个常微分方程系统 正在使用 scipy 的solve ivp 函数求解 它运行良好 但我在访问每个步骤中使用的时间步时遇到问题 我知道solve ivp 将当前时间传递给用户定义的函数 但我需要使用的时间步长 而不是当前时间 为了解决
  • 为什么用字符串和时间增量转置 DataFrame 会转换数据类型?

    这种行为对我来说似乎很奇怪 id列 字符串 在转置后转换为时间戳df如果另一列是时间增量 import pandas as pd df pd DataFrame id 00115 01222 32333 val 12 14 170 df v

随机推荐

  • Python3.5.2 bdist_wininst:需要Python版本-32,在注册表中找不到

    我在 Windows 7 上使用 Python 3 5 2 32 位创建的包出现问题 我通常使用以下命令在 Windows 上部署 Python 包bdist wininst设置工具的选项 这样 我的同事只需启动 Windows 安装程序
  • 连接两个 mp4 视频后视频中出现奇怪的“暂停”

    我正在连接两个 mp4 视频 问题是第一个视频 intro mp4 持续 5 秒 第二个视频 output mp4 持续 2 秒 连接它们创建的视频持续 9 秒 应该持续 5 2 7 秒 在 Final mp4 视频中 第一个视频 intr
  • 在 WooCommerce 中获取并显示相关产品

    我已将 WooCommerce 相关产品包含在主题中 内容如下 这已被复制到我的模板中并正在执行 然而 尽管我对该产品添加了各种追加销售 related products变量 在循环中使用 为 NULL 为了开始展示这些相关产品 是否还有其
  • ARKit:查找屏幕上SCNNode的坐标

    我有一个简单的 Swift ARKit 设置 其中有一个 SCNNode 和一个在 ARSCNView 中可见的 3D 对象 我想确定该对象在 ARSCNView 上的 2D 坐标 我的意思是对象被绘制到屏幕上时的 x 和 y 坐标 I h
  • 运行较少的服务器端与客户端

    与服务器端相比 在客户端运行 LESS 框架有哪些优点 缺点 如果在客户端运行页面加载时间会受到影响吗 在服务器上 您必须更加小心缓存控制标头 并且会牺牲一点 CPU 能力 在客户端 如果 JS 不可用 它就会中断 对于您的生产系统 在构建
  • 代码辅助 (ctrl+space) 在 Eclipse Kepler 上不起作用 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Code assist ctrl space doesn t work on Eclipse Kepler This happened t
  • 事件 - 命名约定和风格

    我正在学习 C 中的事件 委托 我可以询问您对我选择的命名 编码风格 摘自 Head First C 一书 的看法吗 明天我要教一个朋友这个问题 并试图想出最优雅的方式来解释这些概念 认为 理解一门学科的最好方法就是尝试并教授它 class
  • SELECT 命令计算百分比

    我试图根据每个视频相对于所有其他视频的观看次数来获取数据库中每个视频的百分比 然后 我尝试显示从最高观看次数到最低观看次数的所有视频 并在一个漂亮的 HTML 页面内的侧面显示其百分比 显然 百分比范围为 0 100 且不会超过 我认为最受
  • 为什么 AutoHotkey 会响应“系统找不到文件”错误?

    我是 AutoHotkey 的新手 无法理解为什么这个脚本给我这个错误 Failed to launch program or document Action
  • 如何使用Gtk.events_pending?

    我有这个基本的 测试 应用程序 我想在其中显示一个旋转器 而它正在长时间运行发射进程 带有数据库请求的函数 让用户知道它不是在调试而是正在启动 我在其他帖子中读到可以这样做Gtk events pending 功能 但我不知道如何 在哪里使
  • Jquery ajax 表单提交包含文件

    我有一个很长的表格 其中包含文件附件 这就是我的表格的样子 表单将提交至此操作 HttpPost public ActionResult AddReceivingConfirm DTOreceiving entry IEnumerable
  • 如何在 Mongoose Schema 中存储 URL 值?

    我正在将图像从 IOS 应用程序上传到 Firebase Firebase 返回元数据 包括 type 的 URLURL 我应该存储它的类型String在数据库中像下面的代码一样 或者有特定类型URLs var schema new Sch
  • 自定义流程 - 委托

    我想知道是否可以实施openiddict与实施的授权类型类似的授权授权类型here https identityserver4 readthedocs io en latest topics extension grants html wi
  • Java Web 服务和 SOAP - 更改元素名称

    我正在编写一个返回自定义类型的 java Web 服务 一切工作正常 除了当我查看 SOAP 响应时它不使用名称 myType 它使用 return 这是我的 SOAP 响应 基本上它说 return 我希望它说 mytype S Enve
  • UnicodeEncodeError:“ascii”编解码器无法对位置 35 中的字符 u'\xc5' 进行编码:序号不在范围内(128)

    我目前正在使用姜戈国家 https github com SmileyChris django countries获取表单字段的 ISO 国家 地区名称列表 它在我的网站上显示没有错误 但在 Django 的管理网站上 由于存在非 ASCI
  • 如何为登录和注销用户显示不同的链接?

    当用户未登录时我试图显示 Support Log In 当他们注销时 它应该说 Support Log Out 这是我试图用来让它工作的代码 div class fr ul class rss li a href Support a li
  • 如何使用 R 从 Excel 中提取 URL 并将其与显示的文本进行匹配?

    我有一个包含大量超链接的 Excel 文件 我想编写一个程序来提取 URL 并将其与显示的文本进行匹配 我可以将包含解决方案的 URL 导入到上一个问题 https stackoverflow com questions 24149821
  • x 轴日期与 nvd3 中的 y 轴数据不一致

    I am using NVD3 with Flask and I have dates on the x axis 正如您所看到的 x 轴上的线与点不重合 我在 x 轴上打印出日 月 年和小时 我不明白为什么日期间隔不相等 即 小时 不相同
  • NestJS 拦截器:无法在传出请求上设置 HTTP 标头

    我正在 NestJS 中编写 API 其中有一组通用标头 我决定使用拦截器将标头附加到传出请求中 标头不会附加到请求中 因此请求不断失败 拦截器 import as utils from utils utils import CallHan
  • 文件是如何实现的?

    我很好奇文件在 python 中是如何工作的 文件是如何实现的 以便能够像这样循环 csv file open filename csv r for line in csv file do something with line 如果您使用