Python小白教学系列 | 文件与IO

前言

在变量,序列和对象中储存的数据是暂时的,程序结束后就会丢失。为了能够长时间保存程序中的数据,需要将程序中的数据存放到磁盘文件中。

一、基本文件操作

1、创建和打开文件

格式:

file = open(filename,arguments)

#参数说明:
#file : 自定义,打开或创建文件在程序中的体现的形式
#filename : 写文件的直接路径或相对路径,如果有该文件,打开文件读取内容
#			当后面接了w,w+,a或者a+时,若没有该文件,则创建文件再打开文件
#arguments : 为参数,有r,rb,r+,w,wb,w+,a,ab,a+等

示例:

f = open('file', 'w')	#只写模式打开当前目录下的文件file

2、关闭文件

打开文件后,需要及时关闭,以免对文件造成不必要的破坏。

格式:

file.close()		#file为你打开文件时自定义的名字

3、打开文件时使用with语句

推荐:with语句在执行完毕后会自动关闭已经打开的文件

格式:

with expression as target:
    with-body
#参数说明:
#expression:指定一个表达式,可以是打开文件的open()函数
#target:一个变量,将expression表达式中运行的结果保存到这个变量中
#with-body:with语句体,一些操作语句

示例:

with open('/mnt/file','r') as f:
    print(f.read())

运行结果:
人生苦短,我学Python!

4、写入文件内容

file.write(string)	#file为你打开文件时自定义的名字
					#string为写入的字符串

注意:要想写入信息,需要在打开文件时,指定打开模式为可写!

相关参数:

w :只写模式打开文件
w+ :打开文件后,先清空原有内容,在对此文件有读写权限
a :以追加模式打开一个文件(在文件内容的末尾写入)
a+ : 以读写模式打开文件(在文件内容的末尾写入)

5、读取文件

a)读取指定字符

read()

file.read([size])		#file为你打开文件时自定义的名字
						#[size]为指定要读取的字符个数,如果不写,则读取全部内容

注意:使用read()方法的前提是,打开文件时,指定的模式为r(只读)或r+(读写)

示例:

with open('/mnt/file','r') as f:
    print(f.read(4))		#读取前4个字节
    						#/mnt/file的内容为:人生苦短,我学Python!

运行结果:
人生苦短

使用read()方法读取文件时,是从文件的开头读取的。使用seek()方法可以将文件的指针移动到新的位置,结合起来就能根据自己的需求读取文件内容了。

seek()

file.seek(参数1,参数2)
#参数说明
#file:你打开文件时自定义的名字
#参数1:指定移动字符的个数
#参数2:指定从什么位置开始计算移动字符的个数
#		值为0时,表示从文件头开始计算
#		值为1时,表示从当前位置开始计算
#		值为2时,表示从文件尾开始计算
#		参数2不写时,默认为0

注意:如果打开文件时,没有使用rb模式,则只允许从文件头开始计算相对位置

示例:

with open('message.txt','r') as f:
    print(f.read())
	f.seek(6)
    print(f.read(13))

运行结果:
Python的强大,强大到你无法想象!
的强大,强大到你无法想象!

b)读取一行

readline():每次读取一行

格式:

file.readlline()		#file:你打开文件时自定义的名字

注意:需要指定打开模式为r(只读)或r+(读写)

示例:

with open('/mnt/fstab', 'r') as f:
    number = 0
    while True:
        number += 1				#行号
        print(number, f.readline())		#打印每一行的内容
        if f.readline() == "":
            break				#跳出循环

运行结果:
1 

2 # /etc/fstab

3 #

4 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

5 UUID=9c23ef0d-02f7-41d3-adb4-662af3530361 /                       xfs     defaults        0 0

6 UUID=186e4d32-33db-4d1b-9676-b3cce4261d57 swap                    swap    defaults        0 0

3、读取全部行

readlines:读取全部行,返回一个字符串列表,每一行的内容为一个元素

file.readlines()		#file:你打开文件时自定义的名字

注意:需要指定打开模式为r(只读)或r+(读写)

示例:

with open('/mnt/fstab', 'r') as f:
        print(f.readlines())

运行结果:
['\n', '#\n', '# /etc/fstab\n', '# Created by anaconda on Sun Mar  3 02:41:05 2019\n', '#\n', "# Accessible filesystems, by reference, are maintained under '/dev/disk'\n", '# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info\n', '#\n', 'UUID=9c23ef0d-02f7-41d3-adb4-662af3530361 /                       xfs     defaults        0 0\n', 'UUID=fbbe7909-955c-48bb-823e-01d4a84f3f9a /boot                   xfs     defaults        0 0\n', 'UUID=186e4d32-33db-4d1b-9676-b3cce4261d57 swap                    swap    defaults        0 0\n']

文件较大时,采用这种方法输出文件的内容会很慢,可以逐行输出:

示例:

with open('/mnt/fstab', 'r') as f:
    for line in f.readlines() :
        print(line)

二、目录操作(os模块实现)

目录也称文件夹,用于分层保护文件。

1、os 和 os.path 模块

注意:不同的操作系统上运行,可能会得到不一样的结果!我以Linux为例

导入os模块

import os
		#导入os模块后,也可以使用其子模块 os.path

导入os模块后,常用的变量有以下几个:

1)name:用于获取操作系统类型

import os

print(os.name)

运行结果:
如果是 posix		#表示Linux、Unix或Mac OS操作系统
如果是 nt		#表示Windows操作系统

2)linesep :用于获取当前系统上的换行符

import os

print(os.linesep)

3)sep:用于获取当前操作系统所使用的路径分隔符

import os

print(os.sep)

运行结果:
/

2、路径

用于定位一个文件或目录的字符串称为一个路径。

1)相对路径

当前目录:是指当前文件所在的目录,用 os.getcwd() 查看

import os

print(os.getcwd())		#输出当前目录

运行结果:
/root/PycharmProjects/allen/第十四章 文件与IO

相对路径 = 绝对路径 - 当前目录

2)绝对路径

绝对路径是指在使用文件时指定文件的实际路径

格式:

os.path.abspath(要获取绝对路径的相对路径)

示例:

import os

print(os.path.abspath('message.txt'))

运行结果:
/root/PycharmProjects/allen/第十四章 文件与IO/message.txt

3)拼接路径

如果想要将多个路径拼接到一起组成一个新的路径,可以使用join()函数

格式:

os.path.join(path1,path2,...,path n)

注意,使用join()拼接时,并不会检测路径是否真实存在

示例:

import os

print(os.path.join('/mnt','message.txt','dir'))

运行结果:
/mnt/message.txt/dir

3、判断目录是否存在

格式:

os.path.exists(dir_path)

	#dir_path 为要判断的目录或文件,相对路径/绝对路径都可以
	#存在 返回 True
	#不存在 返回 False

示例:

import os

print(os.path.exists('/mnt'))
print(os.path.exists('/mnt/etc'))

运行结果:
True		#存在
False		#不存在

注:还能判断文件是否存在

4、创建目录

1)创建一级目录

格式:

os.mkdir('dir_path')
	#dir_path 为要创建的目录或文件,相对路径/绝对路径都可以

示例:

import os

os.mkdir('/mnt/etc')	#在/mnt下创建etc目录

运行后:
在这里插入图片描述
2)创建多级目录

格式:

os.makedirs('dir_path')
	#dir_path 为要创建的目录或文件,相对路径/绝对路径都可以

示例:

import os

os.makedirs('/mnt/一级/二级/三级')

运行后:
在这里插入图片描述

5、删除目录

rmdir():只能删除空目录

格式:

os.rmdir('dir_path')
	#dir_path 为要删除的目录或文件,相对路径/绝对路径都可以

示例:

import os

if os.path.exists('/mnt/etc') == True:	#判断目录是否存在
    os.rmdir('/mnt/etc')		#删除/mnt/etc目录
else:
    print('/mnt/etc不存在!')

运行后:

在这里插入图片描述

rmtree():可删除非空目录

import shutil	#Python内置的标准模块shutil的rmtree()函数

shutil.rmtree('/mnt/一级')

运行后:
在这里插入图片描述
6、遍历目录

格式:

os.walk(top='path')
	#path : 指定要遍历内容的根目录
	#返回值:返回一个包含三个元素的元组生成器对象

示例:

import os

tuple=os.walk(top='/home/allen')
for i in tuple:
    print(i,"\n")

运行部分结果:

('/home/allen/.mozilla', ['extensions', 'plugins'], [])
返回值:	元素一				元素二					元素三
  当前遍历的路径(字符串)	当前路径下包含的子目录(列表) 当前路径下包含的文件(列表)
('/home/allen/.mozilla/extensions', [], []) 

...

三、高级文件操作

1、删除文件

os.remove(file_path)
		#file_path 为要删除的文件,相对路径/绝对路径都可以

示例:

import os

os.remove('/mnt/file')		#删除/mnt/file文件

运行后:

在这里插入图片描述

2、重命名文件和目录

格式:

os.rename(file_path_name1,file_path_name2)
			#file_path_name1 :为要重命名的文件,相对路径/绝对路径都可以
			#file_path_name2 :为要重命名后的文件,相对路径/绝对路径都可以

示例:

import os

name1='/mnt/fstab'
name2='/mnt/fstab111'
if os.path.exists(name1) == True:		#判断文件是否存在
    os.rename(name1,name2)				#重命名
    print(name1+'已重命名为'+name2)
else:
    print(name1+'不存在!')

运行结果:
/mnt/fstab已重命名为/mnt/fstab111

在这里插入图片描述
注意:
rename()函数也能重命名目录,不过是最后一级目录名称

3、获取文件基本信息

stat() 函数可以获取以下文件信息:
1)文件的最后一次访问时间----st_atime
2)最后一次修改时间-------------st_mtime
3)文件大小(单位为字节)--------st_size
4)设备名-----------------------------st_dev
5)用户ID-----------------------------st_uid
6)组ID--------------------------------st_gid
7)硬链接号(被连接数)------st_nlink
8)索引号----------------------------st_ino

格式:

os.stat(file_path)
		#file_path 为要获取信息的文件,相对路径/绝对路径都可以

示例:

import os

if os.path.exists('/mnt/fstab111') == True:
    f=os.stat('/mnt/fstab111')
    print('/mnt/fstab111大小为',f.st_size,'B')
else:
    print('/mnt/fstab111不存在!')

运行结果:
/mnt/fstab111大小为 501 B

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页