一、文件处理
1.打开文件。
必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
语法:
file object = open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
各个参数的细节如下:
- file:file变量是一个包含了你要访问的文件名称的字符串值。
- mode:mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
- encoding:以何种编码打开该文件,默认编码与操作系统有关。 带b的模式不能指定encoding
- errors:取值一般有strict(默认),ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。
- newline:可以取的值有None, , , ”, ‘ ',用于区分换行符,但是这个参数只对文本模式有效;
- closefd:是与传入的文件参数有关,默认情况下为True,传入的file参数为文件的文件名,取值为False的时候,file只能是文件描述符,什么是文件描述符,就是一个非负整数,在Unix内核的系统中,打开一个文件,便会返回一个文件描述符。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
下图总结了这几种模式:
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | √ | √ | √ | √ | ||
写 | √ | √ | √ | √ | √ | |
创建 | √ | √ | √ | √ | ||
覆盖 | √ | √ | ||||
指针在开始 | √ | √ | √ | √ | ||
指针在结尾 | √ | √ |
File对象的属性
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.encoding | 返回打开文件时的编码 |
如下实例:
f = open("test.txt", "w") print("文件名: ", f.name) print("是否已关闭 : ", f.closed) print("访问模式 : ", f.mode) print("文件编码: ", f.encoding) # 打开文件时候不指定默认与操作系统有关
输出:
文件名: test.txt
是否已关闭 : False
访问模式 : w
文件编码: cp936
close()方法
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
语法:
file.close()
例子:
# 打开一个文件 f = open("test.txt", "w") print("文件名: ", f.name) print("是否已关闭 : ", f.closed) print("访问模式 : ", f.mode) print("文件编码: ", f.encoding) # 打开文件时候不指定默认与操作系统有关 f.close() # 关闭文件 print("是否已关闭 : ", f.closed)
输出:
文件名: test.txt
是否已关闭 : False
访问模式 : w
文件编码: cp936
是否已关闭 : True
读写文件:
write()方法
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
write()方法不会在字符串的结尾添加换行符(' '):
write方法写入文件后返回写入文件的字节数
语法:
file.write(string)
在这里,被传递的参数是要写入到已打开文件的内容。
例子:
# 打开一个文件 f = open("test.txt", "w") size = f.write("hello world ") # 把字符串写入到文件 # 关闭打开的文件 print(size) # 此处输出 12 f.close()
此是会创建一个名为test.txt的文件打开test.txt即可看到写入的内容
read()方法
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
read()方法读的是字符 file的其他所有方法都是读的字节
语法:
file.read([count])
在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
例子:
这里我们用到以上创建的 test.txt 文件。
# 打开一个文件 f = open("test.txt", "r+") str = f.read(5) print(str) str = f.read(5) print(str) # 关闭打开的文件 f.close()
输出:
hello
worl
flush()方法:
将写入的结果立即写入到文件。
语法:
file.flush()
truncate()方法:
文件的截取,属于写方式。但不能使用w+模式(w+模式会把文件内容清空)
语法:
file.truncate(count)
count为截取的文件字节数
例如:
f = open("test.txt", "r+") f.truncate(3) # 截取文件前三个字符 f.close()
此时打开test.txt会看到:
hel
文件定位
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
seek 与 tell 都是按字节读。
例子:
就用我们上面创建的文件test.txt。
# 打开一个文件 f = open("test.txt", "r+") str = f.read(5) print(str) # 查找当前位置 position = f.tell() print("当前文件位置 : ", position) # 把指针再次重新定位到文件开头 position = f.seek(0, 0) str = f.read(10) print(str) # 关闭打开的文件 f.close()
输出:
hello 当前文件位置 : 5 hello worl