Python文件和操作系统基础

news2024/9/23 19:18:06

文章和代码等已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者【AIShareLab】回复 python数据分析 也可获取。

文章目录

  • 文件和操作系统
    • 文件的字节和Unicode

文件和操作系统

代码示例大多使用诸如 pandas.read_csv 之类的高级工具将磁盘上的数据文件读入Python数据结构。但我们还是需要了解一些有关 Python 文件处理方面的基础知识。

为了打开一个文件以便读写,可以使用内置的open函数以及一个相对或绝对的文件路径:

In [207]: path = 'examples/segismundo.txt'

In [208]: f = open(path)

默认情况下,文件是以只读模式(‘r’)打开的。然后,我们就可以像处理列表那样来处理这个文件句柄f了,比如对行进行迭代:

for line in f:
    pass

从文件中取出的行都带有完整的行结束符(EOL),因此你常常会看到下面这样的代码(得到一组没有EOL的行):

In [209]: lines = [x.rstrip() for x in open(path)]

In [210]: lines
Out[210]: 
['Sueña el rico en su riqueza,',
 'que más cuidados le ofrece;',
 '',
 'sueña el pobre que padece',
 'su miseria y su pobreza;',
 '',
 'sueña el que a medrar empieza,',
 'sueña el que afana y pretende,',
 'sueña el que agravia y ofende,',
 '',
 'y en el mundo, en conclusión,',
 'todos sueñan lo que son,',
 'aunque ninguno lo entiende.',
 '']

如果使用open创建文件对象,一定要用close关闭它。关闭文件可以返回操作系统资源:

In [211]: f.close()

with语句可以更容易地清理打开的文件

In [212]: with open(path) as f:
   .....:     lines = [x.rstrip() for x in f]

这样可以在退出代码块时,自动关闭文件。

如果输入f =open(path,‘w’),就会有一个新文件被创建在examples/segismundo.txt,并覆盖掉该位置原来的任何数据。另外有一个x文件模式,它可以创建可写的文件,但是如果文件路径存在,就无法创建。表3-3列出了所有的读/写模式。

对于可读文件,一些常用的方法是read、seek和tell。read会从文件返回字符。字符的内容是由文件的编码决定的(如UTF-8),如果是二进制模式打开的就是原始字节:

In [213]: f = open(path)

In [214]: f.read(10)
Out[214]: 'Sueña el r'

In [215]: f2 = open(path, 'rb')  # Binary mode

In [216]: f2.read(10)
Out[216]: b'Sue\xc3\xb1a el '

read模式会将文件句柄的位置提前,提前的数量是读取的字节数。tell可以给出当前的位置:

In [217]: f.tell()
Out[217]: 11

In [218]: f2.tell()
Out[218]: 10

尽管我们从文件读取了10个字符,位置却是11,这是因为用默认的编码用了这么多字节才解码了这10个字符。你可以用sys模块检查默认的编码:

In [219]: import sys

In [220]: sys.getdefaultencoding()
Out[220]: 'utf-8'

seek将文件位置更改为文件中的指定字节:

In [221]: f.seek(3)
Out[221]: 3

In [222]: f.read(1)
Out[222]: 'ñ'

最后,关闭文件:

In [223]: f.close()

In [224]: f2.close()

向文件写入,可以使用文件的write或writelines方法。例如,我们可以创建一个无空行版的prof_mod.py:

In [225]: with open('tmp.txt', 'w') as handle:
   .....:     handle.writelines(x for x in open(path) if len(x) > 1)

In [226]: with open('tmp.txt') as f:
   .....:     lines = f.readlines()

In [227]: lines
Out[227]: 
['Sueña el rico en su riqueza,\n',
 'que más cuidados le ofrece;\n',
 'sueña el pobre que padece\n',
 'su miseria y su pobreza;\n',
 'sueña el que a medrar empieza,\n',
 'sueña el que afana y pretende,\n',
 'sueña el que agravia y ofende,\n',
 'y en el mundo, en conclusión,\n',
 'todos sueñan lo que son,\n',
 'aunque ninguno lo entiende.\n']

表3-4列出了一些最常用的文件方法。

文件的字节和Unicode

Python文件的默认操作是“文本模式”,也就是说,你需要处理Python的字符串(即Unicode)。它与“二进制模式”相对,文件模式加一个b。我们来看上一节的文件(UTF-8编码、包含非ASCII字符):

In [230]: with open(path) as f:
   .....:     chars = f.read(10)

In [231]: chars
Out[231]: 'Sueña el r'

UTF-8是长度可变的Unicode编码,所以当我从文件请求一定数量的字符时,Python会从文件读取足够多(可能少至10或多至40字节)的字节进行解码。如果以“rb”模式打开文件,则读取确切的请求字节数:

In [232]: with open(path, 'rb') as f:
   .....:     data = f.read(10)

In [233]: data
Out[233]: b'Sue\xc3\xb1a el '

取决于文本的编码,你可以将字节解码为str对象,但只有当每个编码的Unicode字符都完全成形时才能这么做:

In [234]: data.decode('utf8')
Out[234]: 'Sueña el '

In [235]: data[:4].decode('utf8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-235-300e0af10bb7> in <module>()
----> 1 data[:4].decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 3: unexpecte
d end of data

文本模式结合了open的编码选项,提供了一种更方便的方法将Unicode转换为另一种编码:

In [236]: sink_path = 'sink.txt'

In [237]: with open(path) as source:
   .....:     with open(sink_path, 'xt', encoding='iso-8859-1') as sink:
   .....:         sink.write(source.read())

In [238]: with open(sink_path, encoding='iso-8859-1') as f:
   .....:     print(f.read(10))
Sueña el r

注意,不要在二进制模式中使用seek。如果文件位置位于定义Unicode字符的字节的中间位置,读取后面会产生错误:

In [240]: f = open(path)

In [241]: f.read(5)
Out[241]: 'Sueña'

In [242]: f.seek(4)
Out[242]: 4

In [243]: f.read(1)
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-243-7841103e33f5> in <module>()
----> 1 f.read(1)
/miniconda/envs/book-env/lib/python3.6/codecs.py in decode(self, input, final)
    319         # decode input (taking the buffer into account)
    320         data = self.buffer + input
--> 321         (result, consumed) = self._buffer_decode(data, self.errors, final
)
    322         # keep undecoded input until the next call
    323         self.buffer = data[consumed:]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 0: invalid s
tart byte

In [244]: f.close()

如果你经常要对非ASCII字符文本进行数据分析,通晓Python的Unicode功能是非常重要的。更多内容,参阅Python官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

板卡设计资料原理图:536-基于FMC接口的XCZU7EV通用PCIe卡主控计算卡工业控制卡PCIe卡FMC接口卡

基于FMC接口的XCZU7EV 通用PCIe卡 一、板卡简介 基于3U PXIe的ZU11EG/ZU7EG/ZU7EV的通用 &#xff0c;实现FMC的数据接口和主控计算&#xff0c;广泛应用于工业控制&#xff0c;检测&#xff0c;视觉处理。支持工业级温度工作。 二、主要功能 1、板卡核心芯…

html+css学习(中)

css其它选择器 1,根据属性名称选择元素 例img[title]{width:200px}表示带有title属性的元素 2&#xff0c;根据属性值选择元素 [attribute-value]表示匹配某个属性为value的元素 [classone]{color:red;} css伪类 1&#xff0c;状态伪类 < a>< /a> 名字为< a&…

机器学习实战教程(十一):支持向量机SVM

什么是SVM&#xff1f; VM的英文全称是Support Vector Machines&#xff0c;我们叫它支持向量机。支持向量机是我们用于分类的一种算法。让我们以一个小故事的形式&#xff0c;开启我们的SVM之旅吧。 在很久以前的情人节&#xff0c;一位大侠要去救他的爱人&#xff0c;但天空…

买入苹果公司股票的三个理由

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 苹果股票的关键指标 苹果公司&#xff08;AAPL&#xff09;在2023财年第一季度财报发布会上透露&#xff0c;其“活跃设备安装数量”在七年内已经增长了100%&#xff0c;达到了20亿部&#xff0c;这相当于年复合年增长率已…

Vue---Vuex状态管理核心

目录 一、Vuex是干什么的 二、Vuex状态管理核心 &#xff08;1&#xff09;State &#xff08;2&#xff09;Getter &#xff08;3&#xff09;Mutation &#xff08;4&#xff09;Action 一、Vuex是干什么的 vuex的出现就是为了更加方便地管理组件之间的数据交互&#xf…

SpringMVC与SpringWebFlux

文章目录 Spring MVCMVC架构请求处理流程语法代码示例 Spring WebFlux请求处理流程语法代码示例 两者使用对比及建议 Spring MVC Spring Web MVC是建立在Servlet API上的原始Web框架&#xff0c;从一开始就包含在Spring框架中。正式名称 "Spring Web MVC "来自其源模…

控制系统的扰动补偿

名义模型干扰观测器 理论推导 所谓被控对象的名义模型&#xff0c;就是说&#xff0c;实际被控对象无论是通过系统建模还是系统辨识&#xff0c;都无法获得十分精确的参数&#xff0c;名义模型就是与实际系统模型相近的模型&#xff0c;可近似二者相同&#xff0c;即 则 连…

MySQL:常见运算符

前言&#xff1a; 五一过后&#xff0c;我又来啦&#xff01;狂玩五天&#xff0c;放松好心情~ MySQL中的运算符有以下4类&#xff0c;分别是&#xff1a;算数运算符&#xff0c;比较运算符&#xff0c;逻辑运算符&#xff0c;位操作运算符。 算数运算符&#xff1a; 有一定…

【hello Linux】vscode的下载与远程登陆

目录 1. vscode的下载 2. 使用vscode远程登陆至xshell 3. vscode背景颜色的设置 Linux&#x1f337; 1. vscode的下载 1. 点击下方链接进入vscode官网&#xff0c;选择自己所需的vscode版本&#xff0c;直接下载&#xff1b; vscode官网 2. 按如下步骤安装vscode&#xff1b…

USART串口发送

文章目录 运行环境&#xff1a;1.1 串口发送1)用户手册2)原理图 2.1配置1)串口引脚配置2)通讯配置3)RCC和SYS 3.1代码分析3.2添加代码1)串口发送函数2)硬件和驱动安装3)launch设置 4.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 st…

支持轴体热插拔的平价机械键盘,全尺寸带灯效,雷柏V700DIY上手

日常工作娱乐中少不了键盘&#xff0c;这两年定制化的机械键盘很受欢迎&#xff0c;不过动辄上千的发烧键盘还是让很多朋友望而却步&#xff0c;好在目前市面上也有不少平价款的DIY键盘可以选择&#xff0c;像是我现在用的这款雷柏 V700DIY&#xff0c;就可以轻松定制&#xff…

Distilling Step-by-Step: 可以用更少的训练数据与模型尺寸战胜同级别的LLM!

Distilling Step-by-Step: 可以用更少的训练数据与模型尺寸战胜同级别的LLM&#xff01; IntroductionMethod实验参考 Introduction 作者提到部署大模型存在时延、内存、算力等挑战&#xff0c;所以目前的趋势是微调、蒸馏一个不是很大的语言模型&#xff0c;如Vicuna、Alpaca…

一个WPF开发的、界面简洁漂亮的音频播放器

今天推荐一个界面简洁、美观的、支持国际化开源音频播放器。 项目简介 这是一个基于C# WPF开发的&#xff0c;界面外观简洁大方&#xff0c;操作体验良好的音频播放器。 支持各种音频格式&#xff0c;包括&#xff1a;MP4、WMA、OGG、FLAC、M4A、AAC、WAV、APE 和 OPUS&…

【Python入门知识】NumPy数组迭代及连接

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 数组迭代 迭代意味着逐一遍历元素&#xff0c;当我们在 numpy 中处理多维数组时&#xff0c; 可以使用 python 的基本 for 循环来完成此操作。 如果我们对 1-D 数组进行迭代&#xff0c;它将逐一遍历每个元素。 实例 迭…

openSUSE----openSUSE开启sshd服务

【原文链接】openSUSE----openSUSE开启sshd服务 &#xff08;1&#xff09;首先修改配置&#xff0c;编辑 vi /etc/ssh/sshd_config 文件&#xff0c;将如下两个字段设置为yes PermitRootLogin yes PasswordAuthentication yes&#xff08;2&#xff09;然后搜索firewall&…

Springboot +Flowable,DataObject的使用方式

一.简介 在 Flowable 流程图的绘制过程中&#xff0c;可以编写一个名为 dataObject &#xff08;数据对象&#xff09;的元素&#xff0c;这个元素可以指定变量的 id、名称以及数据类型等各种属性&#xff0c;并且在流程实例启动的时候&#xff0c;会自动将 dataObject 元素的…

Pyinstaller将python文件打包成exe程序——封装LoFTR开源匹配代码

Pyinstaller将python文件打包成exe程序——封装LoFTR开源匹配代码 1.LoFTR代码下载及环境搭建 源码下载&#xff1a;https://github.com/bodhisatan/LoFTR-Stitch 环境搭建&#xff1a;按照github项目中的readme文档进行搭建即可&#xff0c;几乎没有遇到问题&#xff0c;代码…

通用操作日志处理方案

why&#xff08;目的理念&#xff09;&#xff1a;操作日志是什么需要做哪些事情&#xff1f; 摘自美团博客的操作日志的介绍 操作日志的记录格式大概分为下面几种&#xff1a; * 单纯的文字记录&#xff0c;比如&#xff1a;2021-09-16 10:00 订单创建。 * 简单的动态的文本…

计算机网络中的路由选择背后的原理到底是什么样的?

路由选择是计算机网络中一个重要的概念&#xff0c;它指的是当一个数据包在网络中传输时&#xff0c;如何选择最优的路径以达到目的地。路由选择涉及到网络中的路由器和交换机&#xff0c;以及它们之间的通信协议。 本文将介绍路由选择的基本概念、算法和协议&#xff0c;以及…

虹科教您 | 基于Windows系统操作使用RELY-TSN-KIT评估套件

我们曾通过3篇文章详细介绍了如何在Linux系统中使用RELY-TSN-KIT并进行TSN协议测试&#xff0c;而本篇文章则将基于Windows系统来进行介绍。与Linux系统的操作类似的部分&#xff0c;本篇文章不再赘述&#xff0c;欢迎通过下方链接阅读前文&#xff1a; 虹科教您 | 基于Linux系…