【Pyhton入门】IO基础操作,read()/read(size)/readline()/readlines()/with open() as f

本文介绍了Python中读取文件的基本方法,包括`f=open()`和`with open() as f`两种方式,以及`read(size)`, `readline()`, `readlines()`的使用。强调了`with`语句的便捷性和安全性。同时讲解了二进制文件的读取以及处理非UTF-8编码文件的方法,提供了处理编码错误的策略。" 129782768,16028331,Python编程练习:数值处理与模拟,"['Python', '编程练习', '算法', '数值计算', '数据转换']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取方法一 f=open()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

读取方法二  with open () as f

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

with open('/path/to/file', 'r') as f:
    print(f.read())

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

f.read(size)

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。

 

readline()

从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。

f = open("a.txt")
line = f.readline()
print(type(line))
while line:
    print line,
    line = f.readline()
f.close()

输出结果:

<type 'str'>
Hello
Welcome

realines()

调用readlines()可一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 打开文件
fo = open("runoob.txt", "r")
print "文件名为: ", fo.name
 
for line in fo.readlines():                          #依次读取每行  
    line = line.strip()                             #去掉每行头尾空白  
    print "读取的数据为: %s" % (line)
 
# 关闭文件
fo.close()

二进制文件

前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:

>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

 

小结

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

 

 

<think>我们正在讨论Python中的双斜线(//)除法运算符。根据用户的问题,我们需要解释它的作用及使用方法。根据引用[1]:双斜杠(//)运算符是Python中用于执行整数除法的运算符。它返回除法结果的整数部分,并且在负数除法时遵循向零取整的原则。引用[2]和[3]补充了在负数情况下的行为,以及它返回的类型取决于操作数的类型。因此,我们可以这样组织回答:1.定义://是整数除法运算符,返回商的整数部分(即向下取整?注意:在负数时是向零取整,所以实际上是floor除法但有调整,更准确的说法是向零取整?)实际上,在Python中,//运算符的行为是“floordivision”,但需要注意的是,对于负数,floordivision是向下取整(向负无穷方向),而向零取整是truncate。但根据引用[1]说“在负数除法时遵循向零取整的原则”,这与引用[2]的示例矛盾(引用[2]说a=-50, b=-5时,a//b=10,这显然是向零取整,因为-50//-5=10,而如果向负无穷取整,结果也是10,因为10已经是整数。但再看一个例子:-5//2,在Python中,-5//2等于-3,因为-2.5向下取整是-3(向负无穷),而向零取整是-2。所以实际上,//是floor division,即向下取整(向负无穷方向))。然而,引用[1]说“向零取整”可能是错误的,因为引用[2]和[3]以及官方文档都表明是floordivision(向下取整)。我们再看引用[3]:双斜杆的结果是保留最小整数(类似于向下取整)。所以,我们应以实际测试为准。为了准确,我们回忆Python的官方定义://运算符执行的是floor division,即对于整数,结果是数学除法的结果向下取整(floor)。对于浮点数,结果也是浮点数,但值是商的floor。但是,用户可能看到引用之间矛盾,所以我们需要澄清。根据我们已知的知识:7//3=2(2.333...向下取整为2)-7 //3= -3 (因为-2.333...向下取整,即向负无穷方向,所以是-3)7// -3 =-3(因为-2.333...向下取整,即向负无穷方向,所以是-3)-7// -3 =2(因为2.333...向下取整为2)而向零取整(truncate)则是:7//3=2,-7//3=-2,7//-3=-2, -7//-3=2显然,Python的//不是向零取整。所以引用[1]中“在负数除法时遵循向零取整的原则”是不正确的。我们应以引用[3]为准,即向下取整(floordivision)。因此,我们需要纠正引用[1]的说法。现在,我们组织回答:1.作用://运算符执行整数除法(也称为地板除),返回商的整数部分,即不大于数学除法结果的最大整数(对于正数,就是截断小数部分;对于负数,则是向负无穷方向取整)。2.使用方法:与普通除法一样使用,只是将除号改为两个斜杠。3.返回类型:如果两个操作数都是整数,则返回整数;如果有一个是浮点数,则返回浮点数(但值是整数除法后的浮点数表示)。4.与单斜杠(/)的区别:单斜杠执行的是真除法(truedivision),返回浮点数结果(在Python3中),而//返回整数(或浮点数,但值是整数除法的结果)。我们还可以举一些例子。另外,引用[2]提到在Python2.7中,//的行为也是floordivision,与Python3一致。所以,回答如下:</think>### Python 双斜线 `//` 除法运算符详解 #### 作用 双斜线 `//` 是 Python 中的**整数除法运算符**(也称地板除),其核心行为是: 1. **返回商的整数部分**:直接舍弃小数部分,不进行四舍五入 2. **负数取整规则**:向负无穷方向取整(非四舍五入或截断) 3. **结果类型**: - 操作数均为整数 → 返回 `int` - 操作数含浮点数 → 返回 `float`(但值为整数) #### 与单斜线 `/` 的对比 | 运算符 | 名称 | 示例 | 结果 | 返回类型 | |--------|------------|--------------|--------|----------| | `/` | 真除法 | `7 / 2` | `3.5` | `float` | | `//` | 整数除法 | `7 // 2` | `3` | `int` | | `//` | 浮点数整数除| `7.0 // 2` | `3.0` | `float` | #### 负数计算规则(关键) ```python print(-7 // 2) # 输出: -4 (-3.5 向负无穷取整为 -4) print(7 // -2) # 输出: -4 (-3.5 向负无穷取整为 -4) print(-10 // 3) # 输出: -4 (-3.33 向负无穷取整为 -4) ``` > **数学原理**:`a // b = floor(a / b)`,其中 `floor()` 是向下取整函数[^3]。 #### 实用场景 1. **获取整数商**: ```python total_pages = (total_items + items_per_page - 1) // items_per_page ``` 2. **离散化处理**: ```python bucket_index = value // bucket_size # 将连续值分桶 ``` 3. **坐标计算**: ```python grid_x = position_x // tile_size # 游戏地图格子坐标 ``` #### 注意事项 1. **除数不能为 0**:触发 `ZeroDivisionError` 2. **浮点数精度**: ```python print(0.1 // 0.03) # 输出: 3.0(实际数学值&asymp;3.33) ``` 3. **与取模运算符 `%` 的关联**: ```python a = b * (a // b) + (a % b) # 恒等式成立 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值