大家应该听说过一句话:“好记性不如烂笔头”。

不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,电脑异常关机之后,“哭都没地方哭了”。

程序运行的时候,相关数据是保存在内存中的,关闭计算机电源,内存中的数据就丢失了。为了永久的保存数据,必须将数据存储于文件内,文件通常是保存在硬盘、软盘或光盘中。

1. 文件的打开与关闭

如果想用word编写一份文档,应该有哪些流程呢

  1. 打开word软件,新建一个word文件
  2. 写入文档内容
  3. 保存文件
  4. 关闭word软件

同样,在操作文件的整体过程与使用word编写文档的过程是很相似的

  1. 打开文件,或者新建一个文件
  2. 读/写数据
  3. 关闭文件

1.1 打开文件

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。

open(文件名,访问模式)

示例如下:



f = open('test.txt', 'w')
    print(f)
    # <open file 'test.txt', mode 'w' at 0x000000000334C150>



文件模式说明




python读取未知类型大的文件_数据


1.2 关闭文件


# 新建一个文件,文件名为:test.txt
    f = open('test.txt', 'w')

    # 关闭这个文件
    f.close()


2. 文件的读写

2.1 写数据(write)

使用write()可以完成向文件写入数据


f = open('test.txt', 'w')
f.write('hello world, i love python!')
f.close()


注意:如果文件不存在那么创建,如果存在那么就先清空,然后写入数据

2.2 读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。


f = open('test.txt', 'r')

content = f.read(5)
print(content)
print("-"*30)
content = f.read()
print(content)

f.close()


运行结果


hello
------------------------------
 world, i love python!


注意:

  • 如果open是打开一个文件,那么可以不用写打开的模式,即只写 open('test.txt')
  • 如果使用read读了多次,那么后面读取的数据是从上次读完后的位置开始的

2.3 读数据(readlines)

就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。


f = open("test.dat", "w")
f.write("hello world!n i love python!n GoodBye!")
f.close()


f = open('test.dat', 'r')
content = f.readlines()
print(type(content))
print(content)

f.close()


运行结果


<type 'list'>
['hello world!n', ' i love python!n', ' GoodBye!']


2.4 读数据(readline)

readline方法每次从文本文件中读取一行的内容,包括换行符。


f = open('test.txt', 'r')

content = f.readline()
print("1:%s"%content)

content = f.readline()
print("2:%s"%content)

f.close()


运行结果


1:hello world!

2: i love python!


行处理程序,函数filterFile拷贝一个文件,同时将旧文件中不是以“#”开头的行写入新文件中:


def filterFile(old, new):
    sfile = open(old, "r")
    dfile = open(new, "w")
    while 1:
        text = sfile.readline()
        if text == "":
            break
        elif text[0] == "#":
            continue
        else:
            dfile.write(text)
        sfile.close()
        dfile.close()


实际应用:文件的备份

需求描述:输入文件的名字,然后程序自动完成对文件的备份。


oldFileName = input("请输入要拷贝的文件名字:")

oldFile = open(oldFileName,'r')

# 如果打开文件
if oldFile:

    # 提取文件的后缀
    fileFlagNum = oldFileName.rfind('.')
    if fileFlagNum > 0:
        fileFlag = oldFileName[fileFlagNum:]

    # 组织新的文件名字
    newFileName = oldFileName[:fileFlagNum] + u'[复件]' + fileFlag

    # 创建新文件
    newFile = open(newFileName, 'w')

    # 把旧文件中的数据,一行一行的进行复制到新文件中
    for lineContent in oldFile.readlines():
        newFile.write(lineContent)

    # 关闭文件
    oldFile.close()
    newFile.close()


3. 文件的定位读写

3.1 获取当前读写的位置

在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取。


# 打开一个已经存在的文件
    f = open("test.txt", "r")
    str = f.read(3)
    print "读取的数据是 : ", str

    # 查找当前位置
    position = f.tell()
    print "当前文件位置 : ", position

    str = f.read(3)
    print "读取的数据是 : ", str

    # 查找当前位置
    position = f.tell()
    print "当前文件位置 : ", position

    f.close()


3.2 定位到某个位置

如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()

seek(offset, from)有2个参数

  • offset:偏移量
  • from:方向
  • 0:表示文件开头
  • 1:表示当前位置
  • 2:表示文件末尾

把位置设置为:从文件开头,偏移5个字节。


# 打开一个已经存在的文件
    f = open("test.txt", "r")
    str = f.read(30)
    print "读取的数据是 : ", str

    # 查找当前位置
    position = f.tell()
    print "当前文件位置 : ", position

    # 重新设置位置
    f.seek(5,0)

    # 查找当前位置
    position = f.tell()
    print "当前文件位置 : ", position

    f.close()


把位置设置为:离文件末尾,3字节处


# 打开一个已经存在的文件
    f = open("test.txt", "r")

    # 查找当前位置
    position = f.tell()
    print "当前文件位置 : ", position

    # 重新设置位置
    f.seek(-3,2)

    # 读取到的数据为:文件最后3个字节数据
    str = f.read()
    print "读取的数据是 : ", str

    f.close()


4. 文件的重命名和删除

有时候,需要对文件进行重命名、删除等一些操作,python的os模块提供了这些功能。


import os

# os模块中的rename()可以完成对文件的重命名操作
os.rename("test.txt", "test-001.txt")

# os模块中的remove()可以完成对文件的删除操作
os.remove("test.txt")


5. 文件夹的相关操作

实际开发中,有时需要用程序的方式对文件夹进行一定的操作,比如创建、删除等。


import os

# 创建文件夹
os.mkdir("软件")

# 获取当前目录
os.getcwd()

# 改变默认目录
os.chdir("../")

# 获取目录列表
os.listdir("./")

# 删除文件夹
os.rmdir("软件")