Python文件操作

创建和打开文件

普通打开方式

在Python中想要操作文件需要先创建或者打开指定的文件并创建文件对象,可以通过内置的open()函数实现。

file = open(FileName, mode , buffering)
  • file:被创建的文件对象
  • FileName:打开的文件及路径
  • mode:可选参数,用于指定打开文件的模式(默认打开模式为r(只读))
  • buffering:可选参数,用于指定文件的缓冲模式,值为0表达式不缓存,值为1表示缓存,如果大于1,则表示缓冲区的大小,默认为缓存模式(一般不用管)。

mode参数的各种对应模式及说明

打开模式 说明 注意
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 文件必须存在
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 文件必须存在
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 文件必须存在
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 文件必须存在
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 文件存在,则将其覆盖,否则创建新文件
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 文件存在,则将其覆盖,否则创建新文件
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 文件存在,则将其覆盖,否则创建新文件
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 文件存在,则将其覆盖,否则创建新文件
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 文件存在,则追加,否则创建新文件
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 文件存在,则追加,否则创建新文件
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 文件存在,则追加,否则创建新文件
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 文件存在,则追加,否则创建新文件

示例代码:

在D盘创建a.txt内容如下:

1
2
3
file = open('D:\\a.txt', 'r')
for i in file:
    print(i)

file.close()

执行结果:
	1
	
	2
	
	3

注意:文件使用完毕后一定要进行关闭

打开文件时指定编码方式

在使用open()函数打开文件时,默认采用GBK编码,当被打开的文件不是GBK时,将会抛出UnicodeDecodeError异常,解决方法如下:

file = open('D:\\a.txt', 'r',encoding='utf-8')

使用with语句打开文件

打开文件后,要及时将其关闭,如果忘记关闭可能带来意想不到的问题,另外,如果在打开文件时抛出了异常,那么将导致文件不能被及时关闭。为了更好的避免此类问题发生,可以使用Python提供的with语句,从而实现在处理时,无论是否抛出异常,都能保证with语句执行完毕后关闭已经打开的文件。

with open(file) as target:
	with-body
  • file:打开的文件及路径
  • target:用于指定一个变量,并且将打开的文件内容保存到该变量
  • with-body:用于指定with语句体,其中可以是执行with语句后相关的操作语句

示例代码:

with open('D:\\a.txt', 'r') as file:
    value = file.read()  # 读取整个文件内容
    print(value)

执行结果:
	1
	2
	3

写入文件内容

写入txt文件

file.write(string)
  • file:为打开的文件对象
  • string:为要写入的字符串

方式1:

lists = ("今天的排程:", "1-起床", "2-吃早餐", "3-爬山")

with open('D:\\a.txt', 'a') as file:  # 创建文件并追加写入
    for i in range(len(lists)):
        value = file.write(lists[i]+'\n')

打开a.txt

今天的排程:
1-起床
2-吃早餐
3-爬山

方式2:

file = open('D:\\a.txt', 'a')
for i in range(len(lists)):
    value = file.write(lists[i]+'\n')

file.close()

打开a.txt

今天的排程:
1-起床
2-吃早餐
3-爬山

注意: 在方式2时,一定要调用close()方法关闭文件,否则写入的内容不会保存到文件夹中。这是因为当我们写入文件内容时,操作系统不会立刻把数据写入磁盘,而是先缓存起来,只有调用close()方法时,操作系统才会保证把没有写入的数据全部写入磁盘。

模式 实现方式
w(写入) 先清空原文件中的内容,再写入新的内容
a(追加) 在文件追加内容

写入csv文件

import csv

value = ['one', 'two', 'three']


def csv_a(va):

    with open('d:/a.csv', 'a', newline='') as file:  # 有newline二次写入时不会有空行
        write = csv.writer(file)  # 实例化
        try:
            write.writerow(va)  # 每次写入一行
        except Exception as e:
            print('写入CSV异常:', e)


csv_a(value)

读取文件

file.read(size)
  • file:为打开的文件对象
  • size:可选参数,用于指定要读取的字符个数,如果省略,则一次性读取所有内容

读取上面的a.txt

with open('D:\\a.txt', 'r') as file2:
    value = file2.read(12)  # 打开前12个字符
    print(value)

执行结果:
	今天的排程:
	1-起床

注意:

  • \n(换行也算两个字符))
  • 文件必须为打开模式(r 或 r+)

从指定位置读取文件

使用seek()

file.seek(offset, whence)
  • file:表示已打开的文件对象
  • offset:用于指定移动的字符个数
  • whence:用于指定从什么位置开始计算(0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算,默认为0)

示例代码:

a.txt内容如下

1234567891011121314151617181920212223242526272829

从第19位开始读取,读取10个字符。

with open('D:\\a.txt', 'r') as file2:
    file2.seek(19)  # 从文件头到第19个字符开始读取
    value = file2.read(10)  # 读取10个字符,文件必须为打开模式:r或r+
    print(value)

执行结果:
	1516171819

读取一行

file.readline()

a.txt内容

今天的排程:
1-起床
2-吃早餐
3-爬山

示例代码:

with open('D:\\a.txt', 'r') as file2:
    value = file2.readline()  # 读取10个字符,文件必须为打开模式:r或r+
    print(value)

执行结果:
	今天的排程:

跳过第一行

另一篇文章

读取全部行

file.readlines()

readlines()和read()不指定size类似,只不过readlines()返回的是一个字符串列表。

a.txt内容

今天的排程:
1-起床
2-吃早餐
3-爬山

示例代码:

with open('D:\\a.txt', 'r') as file2:
    value = file2.readlines()  # 读取10个字符,文件必须为打开模式:r或r+
    print(value)

执行结果:
	['今天的排程:\n', '1-起床\n', '2-吃早餐\n', '3-爬山\n']
posted @ 2018-10-03 21:48  每一天,为明天。  阅读(76)  评论(0)    收藏  举报