人生苦短,我用python。

一、file对象

操作文件首先要创建file对象,file对象使用open()函数来创建。

1、读取创建

(1)读取文本文件,UTF-8编码:
f = open('/Users/michael/test.txt', 'r')

(2)读取二进制文件,比如图片、视频等用rb模式打开文件:
f = open('/Users/michael/test.jpg', 'rb')

(3)读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数:
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')

(4)有些编码不规范的文件,遇到编码错误,最简单的方式是直接忽略(errors参数):
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

2、写入创建

(1)写入文本文件,UTF-8编码:
file = open('/Users/michael/test.txt', 'w')

(2)写入二进制文件:
f = open('/Users/michael/test.jpg', 'wb')

(3)写入特定编码的文本文件,请给open()函数传入encoding参数:
f = open('/Users/michael/gbk.txt', 'w', encoding='gbk')

(4)在文本末尾追加写入,需要传入a参数(append):
file = open('/Users/michael/test.txt', 'w', 'a')

二、读文件

创建file对象后,就可以调取read()方法进行读取内容了。

1、read(size)

从文件读取指定的字节数,如果未给定或为负则读取所有:
line = f.read() #一次性全部读取
line = f.read(10) #一次读取10个字节,即5汉字

2、readline(size)

读取整行,包括 “\n” 字符:
line = f.readline() #一次性读取一整行
line = f.readline(5) #读取一行中的前5个字节

3、readlines(sizeint)

读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区:
lines = f.readlines() #一次性读取所有行,返回列表

三、写文件

创建file对象后,也可以调取write()方法进行写入内容了。

1、write(str)

将字符串写入文件,没有返回值。
f.write('hello world') #向文件写入

2、writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
seq = ["hello\n", "world\n"]
f.writelines(seq) #向文件写入列表,并换行

四、关闭文件

文件使用完毕后必须关闭,关闭后文件不能再进行读写操作。

1、close()

f.close()
由于文件读写时都有可能产生IOError,一旦出错后面的f.close()就不会调用,我们可以使用try...finally来实现

1
2
3
4
5
6
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()

2、with…as…

Python引入了with语句来自动帮我们调用close()方法:

1
2
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')

五、其他操作

1、file.flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

2、file.next()
返回文件下一行。

3、file.tell()
返回文件当前位置。

4、file.seek(offset[, whence])
设置文件当前位置。

  • offset:开始的偏移量,也就是代表需要移动偏移的字节数。
  • whence:默认值为0,表示要从哪个位置开始偏移,0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

5、file.truncate(size)
从文件的首行首字符开始截断,截断文件为size个字符,无size表示从当前位置截断;截断之后V后面的所有字符被删除,其中Widnows系统下的换行代表2个字符大小。

6、file.isatty()
如果文件连接到一个终端设备返回 True,否则返回 False。

7、file.fileno()
返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 文本操作
f = open(r'E:\python_test.txt', 'r') # 只读,光标落在文本开头
f = open(r'E:\python_test.txt', 'w') # 写入,光标落在文本开头,会覆盖原文
f = open(r'E:\python_test.txt', 'a') # 追加,光标落在文本结尾
f = open(r'E:\python_test.txt', 'r+') # 读写,光标落在文本开头,先读后写时会接着结尾写,先写后读会覆盖原文
f = open(r'E:\python_test.txt', 'w+') # 读写,光标落在文本开头,会覆盖原文,读取需要用seek()方法将指针移到开头
f = open(r'E:\python_test.txt', 'a+') # 读写,光标落在文本结尾,写入时会接着结尾写,读取需要用seek()方法将指针移到开头
f = open(r'E:\python_test.txt', 'rb') # 二进制格式只读,光标落在文本开头
f = open(r'E:\python_test.txt', 'wb') # 二进制格式写入,光标落在文本开头,会覆盖原文
f = open(r'E:\python_test.txt', 'ab') # 二进制格式追加,光标落在文本结尾
f = open(r'E:\python_test.txt', 'rb+') # 二进制格式读写,光标落在文本开头
f = open(r'E:\python_test.txt', 'wb+') # 二进制格式读写,光标落在文本开头,会覆盖原文
f = open(r'E:\python_test.txt', 'ab+') # 二进制格式读写,光标落在文本结尾

line = f.read() # 一次性全部读取
line = f.read(10) # 一次性读取10个字节,即5个汉字
line = f.readline() #一次性读取一整行,如果不关闭文档,再次读取时接着上次的位置
line = f.readline(5) #读取一行中的前5个字节
lines = f.readlines() #一次性读取所有行,返回列表

f.write('hello world') # 向文本写入内容
f.writelines(["hello\n", "world\n"]) # 向文本写入多行内容

f.close() # 关闭文件

f.tell() # 返回文件当前位置,字节数
f.seek(-3,2) # (偏移量,偏移位置)偏移量为字节数,偏移位置:0表示从头,1(二进制模式)表示当前位置,2(二进制模式)表示结尾
f.flush() # 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入

with open(r'E:\python_test.txt', 'w') as f:
f.write('Hello, world!')

六、csv文件

1
2
3
4
5
6
7
8
9
10
# csv操作
import csv

with open(r'E:\test.csv', 'r') as csv_r_file: # 只读方式打开csv文件
with open(r'E:\test1.csv', 'w', encoding='utf-8', newline='') as csv_w_file: # 写入方式打开csv文件,newline=''表示去掉空行
csv_writer = csv.writer(csv_w_file) # 定义csv写对象
read_lines = csv.reader(csv_r_file) # 读取所有行数据
for line in read_lines:
csv_writer.writerow(line) # csv写入一行数据
csv_writer.writerows([[11,22],['aa','bb']]) # csv写入多行数据

持续更新…

最后更新: 2018年12月04日 17:38

原始链接: http://pythonfood.github.io/2017/12/30/python文件操作/

× 多少都行~
打赏二维码