python open函数参数_Python|细说函数open()及其返回的文件对象的read、write等方法...

Python标准库内置函数open() 返回一个文件对象(假设赋值给变量fo),返回的文件对象有fo.read()、fo.write()、fo.close()、fo.tell()、fo.seek()、fo.flush()等方法可供使用。

目录

1 内置函数open()

2 文件对象(fo)属性

3 文件对象“读”的方法

4 文件对象“写”的方法

5 fo.tell()、fo.seek()、fo.flush方法

6 fo.close()方法

7 与文件读写相关的内置模块pickle

1 内置函数open()

内置函数open()的基本格式如下:

open

(file, mode='rb', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

以上参数除了file是必须参数以外,其它参数都是可选参数。

(具体参考:https://docs.python.org/3/library/functions.html#open)

1.1 file参数

file必须是一个字符串或表示一个字符串的字符串变量,用这个字符串来表示需要打开的文件的路径。

file可以是绝对路径,如'E:\\test.txt'

也可以是相对路径(相对于当前工作路径),如‘text.txt'

注意路径的规范写法,以下三种写法都是允许的:

'D:/original.txt'

'D:\\original.txt'

r'D:\original.txt'

1.2 mode参数

mode是用来指定文件打开后的操作方式,如'r'是用来read(写),'w‘是指用来write(写,文件打开后第一次使用write()j 用覆盖文件已有内容的方式来写,再次使用write()如果没有改变文件指针的位置则是以追加的方式写入。),'a'也是用来write(写,以追加内容的方式),'+'是指用来update(更新,读和写,可以添加到其它模式中去)。

文件可以以text mode(文本方式)的方式,也可以以binary mode(二进制方式)的方式来读写,分别用'b'和't'来指定。(read()方法在指定整数自变量的情况下会读取指定的字符数或字节数(视打开模式是文本模式还是二进制模式而定))

mode的默认方式是‘rb',也就是打开后以字符串的方式进行读操作。

当文件不存在时,'w'模式会新建文件,'r'模式会出错。

1.3 buffering参数

用于指定buffering(缓存,由磁盘复制到内存的缓冲区)策略。如果该缓冲值被设置为0,则表示不使用缓冲。如果该缓冲值是1,则在访问一个文件进行时使用缓冲。如果指定缓冲值大于1的整数,缓冲使用所指示的缓冲器大小进行。如果是负数,缓冲区大小是系统默认的(默认行为)。

1.4 encoding参数

仅在text mode(文本模式)下指定,指定文本模式时默认采用locale.getpreferredencoding()的返回值作为文件编码,以windows7简体中文版来说是返回CP936或gdk。如有某个.txt文件是以UTF-8编码并且有中文时,open()的参数必须指定编码方式为utf-8,如:open('test.txt', 'rt', ' encoding="UTF-8")

UTF-8的编码方式是每个汉字使用三个字节,如1000个汉字就需要3KB的存储空间。

1.5 errors参数

用于指定文本模式下编码和解码错误时的处理方式;

1.6 newline参数

用于指定文本分行(段),可以用 os.linesep来查询,如widnwos7下就是'\r\n'

1.7 with open() as fileObject

用关键字 with 处理文件对象是个好习惯。它的先进之处在于文件用完后会自动关闭,就算发生异常也没关系。它是 try-finally 块的简写:

>>> with open('/tmp/workfile', 'r') as f:

... read_data = f.read()

>>> f.closed# 如果文件被关闭返回true,否则为false;

True

2 文件对象(fo)属性

一旦文件被打开,则就会有一个文件对象,你就可以得到有关该文件的各种信息。

fo.closed:如果文件被关闭返回true,否则为false;

fo.mode:返回文件打开访问模式;

fo.name:返回文件名;

3 文件对象“读”的方法

3.1 fo.read([size])

read(int size)方法在指定整数自变量的情况下会读取指定的字符数或字节数(视打开模式是文本模式还是二进制模式而定)并返回一个指定数量的字符串。

read()如果没有指定参数,则返回整个文档内容做为一个字符串。当文件大小为当前机器内存两倍时,就会产生问题。

没有参数的read()会一直读文件到文件末尾(文件指针移到最后,指向为空),再操作fo.read()时会返回一个空字符串(""):

3.2 fo.readlines()

该方法也是读取整个文档的内容,返回一个列表。该列表相当于是以换行'\n'符号来分割整个文档,列表的第n个元素就是文档第n+1行的内容;

3.3 fo.readline

该方法每次读取一行的内容,并返回该内容的一个字符串,同时文件指针指向下一行的开头位置,再次运行fo.readline后,则从最新的指针位置开始读取一行的内容返回,直到文档的第后一行,fo.readline在读不到下一行时会返回一个空字符串。

所以此方法通常通过一过while循环来读取整个文档内容。如:

with open('original.txt', 'rU',encoding="UTF-8") as fo:

....str = fo.readline()

....while str:# 使用字符串str是否为空为判断是否有读到最后一行

........……

........str = fo.readline()

3.4 直接迭代

如果open()返回的文件对象都实现了__iter__()方法,可以返回一个迭代器,则在open()后可以直接用for方法迭代,如:

fo = open('original.txt', 'rU',encoding="UTF-8")

for item in fo:

....print(item)

fo.close()

3.5 关于换行

对于文本模式来说,默认读到\n、\r、\r\n时,都可以被判定为一行,而readline()或readlines()读到的第一行的换行字符都一律转换为\n;

对于二进制模式来说,行的判断标准默认是遇到b'\n'这个bytes类型。

文本模式在写入的情况下,任何'\n'都会被置换为os.linesep的值。(windows就是'\r\n')

4 文件对象“写”的方法

4.1 fo.write()方法

写文件需要open()以 'w'、'r+'、 'a'为参数,才可以使用fo.write()方法在文件中写入内容,写入的内容必须是字符串,如果是数字需要用str()函数将其做一个转换。

该方法的返回值是一个整数,表示写入的字符串的长度。

'w',当文本不存在时可以新建(当然不能读),如果文件存在,则先清空文件中的全部内容,‘w+‘虽然也可以读,但也只能读到空白,用+添加附加模式没什么意义。

'r+'是读写的形式,可以读,文件不存在时出错,写也是以覆盖的方式,先清空文件中的全部内容;

'a'是追求读的方式,也就是使用fo.write()方法写入内容到文件时,以前的内容不清空,会在文档的末尾处接着写。

4.2 fo.writelines(sequence)方法

写入字符串序列到文件。如果需要换行,需要加入每行的换行符\n。

fo = open("foo.txt", "r+")

fo.seek(0, 2)# 该语句用于定位文件指针位置,参数0表示位偏移为0,参数2 表示自文件末尾开始

seq = ["\nThis is 8th line\n", "This is 9th line"]

line = fo.writelines( seq )

fo.close() # 文件对象使用close()方法,表示文件对象操作完毕,内存缓存区的内容写入文件,并清空。

5 fo.tell()、fo.seek()、fo.flush

方法

无论读写文件,Python都会跟踪文件中的读\写位置。在默认情况下,文件的读\写位置都位于文件的开始位置。Python提供了控制文件读\写位置的方法,可以改变文件读\写操作发生的位置进行随机读写。

当使用open()函数打开文件时,open()函数在内存中创建缓冲区,将磁盘上的文件内容复制到缓冲区。文件内容复制到文件对象缓冲区后,文件对象将缓冲区视为一个大的列表,其中的每一个元素都有自己的索引,文件对象按字节对缓冲区索引计算。同时,文件对象对文件当前位置,即当前读\写操作发生的位置进行维护。许多方法隐式使用当前位置。比如调用readline()方法后,文件当前位置移动到下一个回车处。

fo.tell() 可以跟踪文件的当前位置,返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针处的比特数。单位是字节B。

需要改变文件对象指针的话,使用 fo.seek(offset,from_what)。指针在该操作中从指定的引用位置from_what移动 offset 比特,引用位置由 from_what 参数指定。 from_what 值为 0 表示自文件起始处开始,1 表示自当前文件指针位置开始,2 表示自文件末尾开始。from_what 可以忽略,其默认值为零,此时从文件头开始。

可以使用seek()实现文件的随机存取,文件的打开方式需要使用'r+'参数。

fo.flush方法在文件关闭前提前刷新内存缓冲区。

with open('c:\\test.txt', 'w') as f:

....f.write("12345")

....print(f.tell())

....f.write("6789")

with open('c:\\test.txt', 'r+') as f:

....f.seek(3)

....f.write('def')

....f.flush

....print(f.tell())

....print(f.read())

....f.seek(0)

....print(f.read())

'''output:

5

6

789

123def789

text.txt内容为:123def789

'''

read()或write()操作后都会使文件指针的位移量发生改变。

read()会在文件指针指向的文件开始的位置开始读,如果没有指定size参数,全部读完后指针也指向到了最后一个字符的空字……

wrtie()会在文件指针最后确定的位移量处写入内容,如果是在中间则会覆盖后面需要的字节数,末尾则是添加。

6 fo.close()方法

文件对象的close()方法用于取消程序和文件之间连接,内存缓冲区的所有内容将写入磁盘。有时忘记使用该方法时会有一些意想不到的错误。

with语句可以打开文件并赋值给文件对象,之后就可以对文件进行操作。文件会在语句结束后自动判读,即使由于异常引起的结束也是如此。

7 与文件读写相关的内置模块pickle

我们可以很容易的读写文件中的字符串。数值就要多费点儿周折,因为 read() 方法只会返回字符串,应该将其传入 int() 这样的方法中,就可以将 '123' 这样的字符转为对应的数值 123。不过,当你需要保存更为复杂的数据类型,例如列表、字典,类的实例,事情就会变得更复杂了。

好在用户不必要非得自己编写和调试保存复杂数据类型的代码。 Python 提供了一个名为 pickle 的标准模块。这是一个令人赞叹的模块,几乎可以把任何 Python 对象(甚至是一些 Python 代码段!)表达为为字符串,这一过程称之为封装 ( pickling )。从字符串表达出重新构造对象称之为拆封( unpickling )。封装状态中的对象可以存储在文件或对象中,也可以通过网络在远程的机器之间传输。

如果你有一个对象 x,一个以写模式打开的文件对象 f,封装对象的最简单的方法只需要一行代码:

pickle.dump(x, f)

如果 f 是一个以读模式打开的文件对象,就可以重装拆封这个对象:

x = pickle.load(f)

-End-

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`xlrd.open_workbook` 是一个函数,它可以打开一个 Excel 文件,并返回一个 `Workbook` 对象,该对象可以用于读取该 Excel 文件中的数据。 以下是 `xlrd.open_workbook` 函数的常用参数和用法: ```python import xlrd workbook = xlrd.open_workbook('example.xlsx') # 打开 example.xlsx 文件返回一个 Workbook 对象 worksheet = workbook.sheet_by_index(0) # 获取第一个工作表 # 读取数据 for row in range(worksheet.nrows): for col in range(worksheet.ncols): cell_value = worksheet.cell_value(row, col) print(cell_value) ``` 其中,`xlrd.open_workbook` 函数的参数可以是文件名或文件对象,常用参数如下: - `filename`:要打开的 Excel 文件名。 - `file_contents`:要打开的 Excel 文件的内容,以二进制字符串或字节串的形式传入。 - `on_demand`:是否启用懒加载模式,即只有在需要读取某个工作表时才会将其加载到内存中,默认为 False。如果 Excel 文件很大,可以使用这个参数来减少内存占用。 如果成功打开 Excel 文件,则 `xlrd.open_workbook` 函数返回一个 `Workbook` 对象,该对象包含以下常用属性和方法: - `sheet_names()`:返回一个列表,包含工作簿中所有工作表的名称。 - `sheet_by_name(name)`:根据工作表名称返回一个 `Sheet` 对象。 - `sheet_by_index(index)`:根据工作表索引返回一个 `Sheet` 对象。 - `nsheets`:返回工作簿中工作表的数量。 - `sheet_loaded(sheet_name_or_index)`:返回一个布尔值,表示指定的工作表是否已经被加载到内存中。 - `unload_sheet(sheet_name_or_index)`:卸载指定的工作表,释放该工作表占用的内存。 - `release_resources()`:释放所有占用的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值